浅析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.ini实现Mysql导入数据库文件最大限制的修改方法
Dec 11 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
smarty实现多级分类的方法
Dec 05 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
浅析PHP数据导出知识点
Feb 17 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
Jun 05 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
关于laravel 日志写入失败问题汇总
Oct 17 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
一则python3的简单爬虫代码
2014/05/26 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
flask入门之表单的实现
2018/07/18 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
详解django中Template语言
2020/02/22 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Python xlwt模块使用代码实例
2020/06/10 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
ORACLE十问
2015/04/20 面试题
好的自荐信的要求
2013/10/30 职场文书
小学生优秀评语大全
2014/04/22 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python