浅析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新手上路(九)
Oct 09 PHP
php实现的简单压缩英文字符串的代码
Apr 24 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
php数组键名技巧小结
Feb 17 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python中尾递归用法实例详解
2015/04/28 Python
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
Python之父谈Python的未来形式
2016/07/01 Python
Python之修改图片像素值的方法
2019/07/03 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
python3实现飞机大战
2020/11/29 Python
python 模拟登陆163邮箱
2020/12/15 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
高考标语大全
2014/06/05 职场文书
公司门卫工作职责
2014/06/28 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
javascript数组includes、reduce的基本使用
2021/07/02 Javascript