PHP魔术函数的性能测试
测试方法,新建一个名为User的PHP类,循环1000000次读取相关属性测试。 第一个测试,设置$username为私有方法,在循环内部生成类对象,使用__get获得其值
<?php class User { private $username; public function __get($name) { return $this->$name; } } for ($i = 0; $i < 1000000; $i++) { $user = new User; $user->username; } ?>
real 0m4.487s user 0m4.192s sys 0m0.291s
第二个测试,设置$username为公有方法,在循环内部生成类对象,直接获得其值
<?php class User { public $username; public function __get($name) { return $this->$name; } } for ($i = 0; $i < 1000000; $i++) { $user = new User; $user->username; } ?>
real 0m1.403s user 0m1.395s sys 0m0.008s
第三个测试,设置$username为私有方法,在循环外部生成类对象,使用__get获得其值
<?php class User { private $username; public function __get($name) { return $this->$name; } } $user = new User; for ($i = 0; $i < 1000000; $i++) { $user->username; } ?>
real 0m2.677s user 0m2.453s sys 0m0.224s
第四个测试,设置$username为公有方法,在循环外部生成类对象,直接获得其值
<?php class User { public $username; public function __get($name) { return $this->$name; } } $user = new User; for ($i = 0; $i < 1000000; $i++) { $user->username; } ?>
real 0m0.543s user 0m0.537s sys 0m0.007s

可见新建类操作与使用魔术方法都比较消耗资源,使用的时候一定要小心谨慎哦……


public和private都会调用__get()方法吗?
@kangzj
public之后,由于$username属性可见,于是就不会再去调用__get()方法了。
@有颜色的猫
我觉得也是,呵呵;直接访问肯定要快些吧