2015-09-16 98 views
1

因此,除了顯而易見的可讀性改進(無論如何)之外,當將局部變量賦值給超全局數組中的元素的值時,與直接訪問元素的值?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']; 
} 
+1

我會爭辯說,如果你首先使用一個類,那麼你應該使用一個屬性來封裝的緣故。我不會擔心這樣的微觀優化,因爲a)性能收益實際上並不明顯,並且b)您已經在使用PHP類。任何PHP應用程序中的大多數優化都是通過減少冗餘函數調用和調用未索引的數據庫字段等來完成的。 – fisk

回答

1

From PHP Docs

默認情況下,變量總是值分配。也就是說,當您將一個表達式分配給一個變量時, 原始表達式的整個值是複製到目標變量中的 。例如,這個 的意思是,在將一個變量的值分配給另一個變量的值 之後,更改其中一個變量將不會影響其他變量。有關此類賦值的更多信息,請參閱表達式上的 一章。

PHP還提供另一種方法將值分配給變量:由 分配參考。這意味着新變量只是簡單地引用(在 中的其他詞,「成爲別名」或「指向」)原始 變量。新變量的更改會影響原始數據,並且會影響到該數據。

也就是說,除非你使用參考分配,這兩個例子都是同樣的事情(除非你使用的第一個額外的內存幾乎不相干的量,有兩個瓦爾具有相同值)。

+2

只是一個補充:PHP將不會複製該變量的結構,而是通過值進行賦值,而是會增加一個引用計數器。從開發者的角度來看,它似乎是一個副本。更改變量的值時將進行實際複製。 – Pred

+0

好點,但不會再是副本,因爲它的價值發生了變化。 –

+0

實際上,這個過程是:克隆原始結構,然後修改數據(或即時覆蓋它),所以是的,它是一個副本。 – Pred

0

它取決於PHP版本和您如何聲明成員變量。

在PHP < = 5.3中,一般的答案是否定的:兩者都是容器訪問,其中PHP實現爲恆定時間內的哈希表查找。在對象屬性的情況下,您的容器是$this。在超全球的情況下,你的容器是$_SERVER

在PHP> = 5.4中,答案可能是。當你宣佈proeprty時,PHP optimizes the memory footprint and access path。當你不聲明屬性時,查找是一個哈希表掃描,因此這兩種方法同樣是高性能的。

因此,聲明你的屬性是最快的。