浅析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 相关文章推荐
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
PHP常用编译参数中文说明
Sep 27 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
php函数传值的引用传递注意事项分析
Jun 25 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 PHP
windows环境下使用Composer安装ThinkPHP5
May 18 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 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 checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
新手简单了解vue
2019/05/29 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
Python绘图实现显示中文
2019/12/04 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
安全检查验收制度
2014/01/12 职场文书
主题团日活动总结
2014/06/25 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
电影开国大典观后感
2015/06/04 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
MySQL 开窗函数
2022/02/15 MySQL
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
如何利用python创作字符画
2022/06/25 Python