PHP和变量赋值与直接访问超全局数组


PHP and variable assignment versus direct access to superglobal array

那么,除了明显的可读性改进(至少对我来说)之外,在PHP中,将局部变量赋值给超全局数组中的元素值,与直接访问元素值相比,是否有性能上的好处?

例如,给定一个类重复使用:$_SERVER['REQUEST_URI']作为许多函数的参数,创建一个类属性(或者具有类作用域的局部变量)并直接使用该变量是否有性能优势?我有c#背景,并且我从经验中了解到,使用局部变量确实会带来性能上的好处。

$url = $_SERVER['REQUEST_URI'];
public function doSomething() {
echo $this->url;
}
public function doSomethingElse() {
echo $this->url;
}

public function doSomething() {
echo $_SERVER['REQUEST_URI'];
}
public function doSomethingElse() {
echo $_SERVER['REQUEST_URI'];
}

From PHP Docs:

默认情况下,变量总是由value赋值。也就是说,将表达式赋值给变量时,表达式的整个值原始表达式是将复制到目标变量中。这表示,例如,将一个变量的值赋给另一方面,改变其中一个变量不会对其他。有关此类作业的更多信息,请参阅表达式。

PHP还提供了另一种给变量赋值的方法:assign by参考。这意味着新变量只是引用换句话说,"成为"或"指向"的别名)变量。对新变量的更改会影响原始变量,反之亦然versa .

也就是说,除非您使用引用赋值,否则这两个示例是相同的(除了您在第一个示例中使用了几乎无关的额外内存量,有两个具有相同值的变量)。

这取决于PHP版本和如何声明成员变量。

在PHP <= 5.3中,一般答案是否定的:两者都是容器访问,PHP在常量时间内实现哈希表查找。在对象属性的情况下,您的容器是$this。在超全局的情况下,你的容器是$_SERVER

在PHP>= 5.4中,答案是可能。在声明该属性时,PHP会优化内存占用和访问路径。当不声明属性时,查找是哈希表扫描,因此两种方法的性能相同。

所以,声明你的属性是最快的。