浅析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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
PHP远程采集图片详细教程
Jul 01 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
CI框架的安全性分析
May 18 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
May 02 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 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导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
jquery 学习笔记一
2010/04/07 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python微信操控itchat的方法
2019/05/31 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
护士见习期自我鉴定
2014/02/08 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
项目合作意向书范本
2014/04/01 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
会计工作岗位职责
2015/02/03 职场文书
领导干部失职检讨书
2015/05/05 职场文书
嘉年华活动新闻稿
2015/07/17 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
Python+tkinter实现高清图片保存
2022/03/13 Python
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android