PHP代码优化与成员变量的速度比较

下面的代码有4个示例,您认为它们是什么创建的,成员变量的速度排序是什么

1:将成员变量设置为公共变量,通过赋值操作将变量赋给成员变量,直接获得变量。
复制代码代码如下所示:
< PHP
类Foo {
公共身份证;
}
$ =新富;
$数据> > id = 10;
数据$ > id;
>

2:将成员变量设置为公共值,由构造函数设置成员变量的值,并直接获取变量。
复制代码代码如下所示:
< PHP
类Foo2 {
公共身份证;
公共功能__construct($id){
此$;
}
}

$data =新Foo2(10);
数据$ > id;
>

3:将成员变量设置为受保护,通过构造函数设置成员变量的值,然后用魔法方法获取变量。
复制代码代码如下所示:
< PHP
类foo3 {
受保护的美元身份证;
公共功能__construct($id){
此$;
}

公共函数getID(){
返回$;
}
}
$data =新foo3(10);
echo $数据-> getID();
>

4:将成员变量设置为受保护,由构造函数设置成员变量的值,并通过成员方法获取变量。
< PHP
类foo4 {
受保护的美元身份证;
公共功能__construct($id){
此$;
}

公共功能__get($键){
返回$;
}
}
$data =新foo4(10);
数据$ > id;
>
按执行速度排序:1243
让我们在看看:第一码
1:
复制代码代码如下所示:
1 zend_fetch_class 4:4'foo
2新5美元:4
3 do_fcall_by_name 0
4分配!0, $5
5 zend_assign_obj!0、'id'
6 zend_op_data 10
7 fetch_obj_r 9美元!0、'id'
8回声9美元

2:
复制代码代码如下所示:
1 zend_fetch_class 4:10'foo2
2新的11:10
3 send_val 10
4 do_fcall_by_name 1
5分配!1,11美元
6 fetch_obj_r 14美元!1、'id'
7回声14美元

三:
复制代码代码如下所示:
1 zend_fetch_class 4:15'foo3
2新的16:15
3 send_val 10
4 do_fcall_by_name 1
5分配!2,16美元
6 zend_init_method_call!2、'getid
7 do_fcall_by_name 0 20美元
8回声20美元

4:
复制代码代码如下所示:
1 zend_fetch_class 4:21'foo4
2新的22:21
3 end_val 10
4 do_fcall_by_name 1
5分配!3,22美元
6 fetch_obj_r 25美元!3、'id'
7回声25美元


根据操作码以上,发现在zend_vm_execute其操作码实现的参考我们。h文件

1。在PHP内核中创建对象的过程分为三个步骤:

ZEND_FETCH_CLASS gets the variable of the storage class based on the class name, which is actually a lookup operation for a hashtalbe EG (class_table)
新的初始化对象和点前(电话)-> FBC的构造函数的指针。
调用构造函数,其调用其他函数调用一样,所有这些都被称为zend_do_fcall_common_helper_spec

两。魔术方法的调用是由条件触发的,而不是直接调用,例如在我们的示例中获取成员变量id。

(zend_std_read_property)步骤如下:
获得一个对象的属性,如果有第二个步骤;如果没有相关属性,请转到第三步
是否存在与对象属性对应的名称的属性,如果返回结果,如果不存在,请转到第三步
如果有一个__get魔术的方法,这种方法被称为得到的变量,如果它不存在,报道是错误的。
回到排序问题:

第一和第二之间有什么区别

第二码小于第一,但慢一点比第一,因为构造函数的参数较多,一个带有一个参数的操作码参数的处理是一个耗时的操作。当我们进行代码优化时,可以删除一些不必要的参数。当一个函数有多个参数时,它可以通过数组传递。

两。为什么第三个是最慢的

因为它的获取参数本质上是对对象成员方法的调用,所以该方法的成本高于变量的获取。

三。为什么第四比第三快

因为第四操作本质上是接受变量的,但是它在内部实现了魔术方法调用,内部函数调用的效率要高于用户定义的方法。
四,为什么第四比第二慢
因为在PHP的对象采集的过程中,当成员变量是在类的定义,它会调用PHP特定魔法的方法__get,不止一个神奇的方法调用。

总结:

1。使用PHP内置函数
2。不是面向对象(OOP)的问题,面向对象通常是昂贵的,每个方法和对象调用都会消耗大量内存。
三.尽量不要使用魔法——除非是必要的,不要使用框架,因为框架有大量的魔法方法。
4。在性能优先的应用程序场景中,当需要使用OOP时,使用成员变量是一种更好的方法。
5。可以使用PHP语法结构不使用函数,可以使用内置函数不写,可以使用函数不使用对象。