浅析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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
相对路径转化成绝对路径
Apr 10 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php编写的一个E-mail验证类
Mar 25 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
php操作MongoDB类实例
Jun 17 PHP
php实现对象克隆的方法
Jun 20 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 PHP
php中yii框架实例用法
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文件锁函数flock()详细介绍
2014/11/18 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
php+jQuery递归调用POST循环请求示例
2016/10/14 PHP
js CSS操作方法集合
2008/10/31 Javascript
document.createElement()用法
2013/03/13 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
简单介绍Python中的JSON使用
2015/04/28 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
小学运动会班级口号
2014/06/09 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
anaconda python3.8安装后降级
2021/06/11 Python