魔术函数肯定比 PHP 中的任何其他函数都慢,应该小心使用。这实际上是一个很好的博客主题(使用魔术函数自动创建属性以加快速度......无论如何)。正如El Yobo所说,我修改了您的 PHP 脚本,以便测试更准确:
<?php
class A {
public function __get($a) {
return 5;
}
}
class B {
public $a = 5;
}
class C {
private $a = 5;
public function __get($a) {
return $this->a;
}
}
$classes = array('A','B','C');
header('Content-type: text/plain; charset=utf-8');
foreach ($classes as $className) {
$a = new $className;
$start = microtime(true);
for ($i=0; $i < 1000000; $i++) {
$b = $a->a;
}
$end = microtime(true);
echo 'Class ' . get_class($a) . ' = ' . (($end - $start) * 1000) ." msec\n";
}
导致
Class A = 378.85212898254 msec
Class B = 109.26413536072 msec
Class C = 423.51794242859 msec
所以你有它。您可以清楚地看到,使用魔法函数时,执行时间大约是公共方法的 4 倍。
**编辑**
现在,如果您动态创建新的类属性,那么魔术方法只会在第一次被调用,然后任何后续调用都将访问动态创建的公共属性(public 用于向后兼容)。将 C 类更改为:
class C {
public function __get($a) {
$this->a = 5;
return 5;
}
}
将输出
Class A = 392.09413528442 msec
Class B = 110.16988754272 msec
Class C = 96.771955490112 msec
所以这就是为什么你说:“嘿!它更快!” 但是,看看我们是否将迭代次数从 减少1000000
到10
(例如):
Class A = 0.033140182495117 msec
Class B = 0.0078678131103516 msec
Class C = 0.01215934753418 msec
C 类现在比 B 慢,因为它是对魔法方法的初始调用。我最好的猜测是 PHP 处理动态创建的属性与声明的属性不同。但经过进一步研究,这些结果可能会因操作系统、CPU 架构、内存、PHP 版本等而有所不同。因此,这些结果不能被认为是理所当然的,而且一般来说,魔术方法的执行时间总是比使用声明的公共属性要长或调用已声明的公共方法。
**编辑 2 **
这是 D 类测试,通过动态属性创建跳过魔术方法:
class D {
public function __construct() {
$this->a = 5;
}
}
产生这些结果 1000 次迭代:
Class A = 1.3999938964844 msec
Class B = 0.42200088500977 msec
Class C = 0.3960132598877 msec
Class D = 0.37002563476562 msec <-- faster
让我们将迭代次数增加到 1'000'000 :
Class A = 380.80310821533 msec
Class B = 109.7559928894 msec
Class C = 91.224908828735 msec <-- faster ???
Class D = 96.340894699097 msec
如果魔术方法有很大的开销成本,那么现在真正的问题是:为什么在多次重复访问同一个属性时,是
public function __get($a) {
$this->a = 5;
return 5;
}
比...快
public function __construct() {
$this->a = 5;
}
创建和访问动态属性时?