浅析PHP的静态成员函数效率更高的原因


Posted in PHP onJune 13, 2014

很多php开发人员都知道, 使用类的静态成员函数效率比类的普通成员函数的要高,本文从应用层次分析这个问题

下面是一个范例:

<?php // php静态方法测试
header('Content-Type: text/html; charset=utf-8');
class xclass{
     public static $var1 = '1111111111111111';
     public $var2 = 'aaaaaaaaaaaaa';
     public function __construct()
    {
         $this -> var2 = 'bbbbbbbbbbbbbbbb';
         }
     public static function secho1()
    {
         echo self :: $var1 . '<hr />';
         }
     public function secho2()
    {
         echo $this -> var2 . '<hr />';
         }
     public function secho3()
    {
         echo 'cccccccccccccc<hr />';
         }
     }
 xclass :: secho1();
 xclass :: secho3();
 echo "------------------------------<br />";
 $xc = new xclass();
 $xc -> secho1();
 $xc -> secho2();
 ?>

认真看上面的范例,会发现一个有趣的地方,secho1()定义为静态方法后, 在动态类的对像实例中仍可以引用为动态方法,而secho3()也可以被当作静态成员函数,从这个层面,不难理解为什么说静态成员函数比动态的快。

可能是由于兼容性原因,php的类成员其实并无明显的动静态之分,所有成员在没明确声明的情况下都会被当成静态成员存放在特定的内存区中,所以调用静态成员函数就和调用普通函数一样,速度很快。

但调用动态类则不同,它要以这个类结构作为样本,在内存中重新生成一个对象实例,所以多了一个过程,这对于简单的类来说,可能不算什么,但对于复杂的类来说这是明显影响效率的。

有人会担心,使用静态方法会不会造成内存占用过多,其实从上面分析可以知道,你不声明静态方法,系统依然会把成员当成静态,因此对于一个完全静态方法的类和一个完全动态但没声明实例对象的类占用内存几乎是一样的,所以对于比较直接的逻辑,都建议直接用静态成员方法,当然,一些复杂或对像化明显的逻辑,如果完全用静态类也不是没可能,但那样就失去类的意义了,如果这样,何必OOP,按用途,静态方法特别适用于MVC模式的逻辑类中。

 

PHP 相关文章推荐
PHP与SQL注入攻击[二]
Apr 17 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php输出xml必须header的解决方法
Oct 17 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
Yii中CGridView禁止列排序的设置方法
Jul 12 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 #PHP
PHPAnalysis中文分词类详解
Jun 13 #PHP
ThinkPHP缓存方法S()概述
Jun 13 #PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 #PHP
浅析ThinkPHP中execute和query方法的区别
Jun 13 #PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 #PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 #PHP
You might like
世界第一个无线广播电台 KDKA
2021/03/01 无线电
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
python自带的http模块详解
2016/11/06 Python
Django的信号机制详解
2017/05/05 Python
详解python eval函数的妙用
2017/11/16 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Python字典的核心底层原理讲解
2019/01/24 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
python super函数使用方法详解
2020/02/14 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
优秀党支部事迹材料
2014/01/14 职场文书
2015年元旦活动总结
2014/05/09 职场文书
党支部活动策划方案
2014/08/18 职场文书
安全生产月宣传标语
2014/10/06 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP