浅析PHP的静态成员函数效率更高的原因_php技巧

很多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模式的逻辑类中。

 

时间: 2024-09-04 08:11:46

浅析PHP的静态成员函数效率更高的原因_php技巧的相关文章

PHP 字符串长度判断效率更高的方法

 在php里当需要判断一个字符串长度时,我们首先想到的是strlen()函数,不错,strlen()返回的就是字符串的长度,这样使用没有任何问题.不过,如果要从php程序优化的角度来看,使用strlen()判断字符串长度未免是最好的写法 有经验的程序员发现,php判断字符串长度,使用isset()在速度上比strlen()更快,执行效率更高. 即:    代码如下: $str = 'aaaaaa'; if(strlen($str) > 6) VS if(!isset($str{6})   用例子

探讨++i与i++哪个效率更高_C 语言

答案: 在内建数据类型的情况下,效率没有区别: 在自定义数据类型的情况下,++i效率更高! 分析: (自定义数据类型的情况下) ++i返回对象的引用: i++总是要创建一个临时对象,在退出函数时还要销毁它,而且返回临时对象的值时还会调用其拷贝构造函数. (重载这两个运算符如下) 复制代码 代码如下: #include <iostream>using namespace std; class MyInterger{public:    long m_data;public:    MyInter

for-关于循环这两个代码哪个效率更高?

问题描述 关于循环这两个代码哪个效率更高? 代码1: i=0; while(1) { for(i=0;i<25;i++) { a=1; } for(;i<50;i++) { a=0; } i=0; } 代码2: i=0; while(1) { i++; switch(i) { case 1: a=1; break; case 25: a=0; break; case 50: i=0; break; } } 解决方案 回复chezunyin: 不好说,不同的处理器执行不同的指令花费的时间不同,这

const 和enum 谁效率更高,占用资源更少

问题描述 const 和enum 谁效率更高,占用资源更少 asp.net 中 const 和enum 谁效率更高,占用资源更少 解决方案 这个应该区别不大

mysql-MySql和oracle的区别有哪些?哪个效率更高,是Oracle吗?

问题描述 MySql和oracle的区别有哪些?哪个效率更高,是Oracle吗? MySql和oracle的区别有哪些?哪个效率更高,是Oracle吗?如果是oracle效率更高,那怎么样让Mysql的效率比oracle更高? 解决方案 数据量小的用mysql,大的就用oracle吧 解决方案二: 数据库发展到现在,谁也没有什么"独门秘笈"了.这意味着其实各大数据库系统的效率其实差不多.但是一个好的dba写的查询可以比一个差的dba快100倍.算法和查询的写法才是你要关注的东西. 解决

iPad将成为美国国会效率更高的利器

近日有消息称,美国众议院议员亨利·库勒(Henry Cuellar)近期在发表演说时携带了自己的iPad,这或许将改变美国国会的传统. 美国众议院议员此前大多拒绝使用科技产品.反对者认为,在国会中使用科技产品将带来麻烦,尤其考虑到国会议员的人数很多. 库勒周四在接受采访时谈到了为何使用iPad.他表示:"如果你去了解可以使用的技术,并以合适的方式利用这些技术,那么可以使国会的效率更高.通过iPad,我们可以获得许多即时信息."库勒表示,iPad可以用于实时地做研究,或是下载账单.他表示

对象-Dbhelper save 和 update哪一个效率更高

问题描述 Dbhelper save 和 update哪一个效率更高 public void updateUser(int id, int time, String password) throws Exception { // 根据用户id查询用户 User user = getUser(id); // time==1,需要更新系统时间 if (time == 1) { user.setLast_vist_time(DateUtil.formatDate(new Date())); ; } /

杏树林CEO张遇升:通过移动互联网让医生工作效率更高

图为杏树林创始人兼CEO张遇升 &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 投资界6月20日消息,在清科集团主办的"第三届中国医疗1152.html">健康产业投资大会"上,杏树林CEO张遇升表示,杏树林要解决的问题是怎么样能够通过现代移动互联网的技术手段让医生的工作效率更高,能够提高他的工作轻松. 以下是演讲实录: 张遇升:我是杏树林的张遇升,我自己学医出身,以前是在协和

《C和C++程序员面试秘笈》——1.4 i++与++i哪个效率更高

1.4 i++与++i哪个效率更高 C和C++程序员面试秘笈考点: i++和++i的效率比较 出现频率: [解析] 在这里声明,简单地比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案.首先考虑内建数据类型的情况:如果自增运算表达式的结果没有被使用,而是仅仅简单地用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异.我们看看下面这个程序. #include <s