浅析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作的文本留言本的例子(三)
Oct 09 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
php遍历数组的4种方法总结
Jul 05 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
php数组转成json格式的方法
Mar 09 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 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
php数据库密码的找回的步骤
2011/01/12 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
python操作xml文件示例
2014/04/07 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
python实现汽车管理系统
2018/11/30 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
Python中turtle库的使用实例
2019/09/09 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
单位领导证婚词
2014/01/14 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
公司活动方案范文
2014/03/06 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
上党课的心得体会
2014/09/02 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
中秋节晚会开场白
2015/05/29 职场文书