php 靜態變數 效能_關於效能:PHP中的const vs static

本問題已經有最佳答案,請猛點這裡訪問。

在php5中,我可以向類宣告常數值:

class config

{

const mailserver = 'mx.google.com';

}

但我也可以宣告公共靜態:

class config

{

public static $mailserver = 'mx.google.com';

}

在設定檔的情況下,我將稍後介紹,例如:

imap_connect(config::$mailserver ...

imap_connect(config::mailserver ...

你認為哪個選項更適合使用??(更快、更少的記憶體負載等)

謝謝。

靜態變數可以更改,常數變數不能更改。應該主要考慮配置變數是否能夠在執行期進行更改,而不是哪個更快。兩者之間的速度差(如果有的話)是如此之小,不值得考慮。

使用函式回傳全域

0.0096、0.0053、0.0056、0.0054、0.0072、0.0063、0.006、0.0054、0.0054、0.0055、0.005、0.0057、0.0053、0.0049、0.0064、0.0054、0.0053、0.0053、0.0061、0.0059、0.0076、配置1

使用get-instance-normal類

0.0101,0.0089,0.0105,0.0088,0.0107,0.0083,0.0094,0.0081,0.0106,0.0093,0.0098,0.0092,0.009,0.0087,0.0087,0.0093,0.0095,0.0101,0.0086,0.0088,0.0082,配置2

使用靜態VaR

0.0029,0.003,0.003,0.0029,0.0029,0.0029,0.003,0.0031,0.0032,0.0031,0.0029,0.0029,0.0029,0.0029,0.0031,0.0029,0.0029,0.0029,0.0029,0.0029,配置3

使用常數VaR0.0033、0.0031、0.0031、0.0031、0.0031、0.0031、0.0032、0.0031、0.0031、0.0031、0.0031、0.0034、0.0031、0.0031、0.0033、0.0031、0.0037、0.0031、0.0031、0.0032、0.0031、配置4

ZZU1〔0〕

在不允許靜態變數的情況下,可以使用常數作為預設函式引數值。

雖然這是一個有效的觀點,但這並不能解決"哪一個更好用?"可能,如果問題是"在這個場景中使用哪個更好",是的-但總的來說,不是。

@新傢具,我不同意你的意見。指出其中一個或另一個的限制必然說明另一個可能更好。而且,由於這正是最受歡迎和公認的答案的論據,我不認為我是唯一一個這樣做的人。

const和static的另一個區別是類常數中不允許使用陣列等變數,因此

class mytest

{

public static $c = array(1=> 'hello', 2=>'world');

}

作品,但

class mytest

{

const c = array(1=> 'hello', 2=>'world');

}

不會。

自從p5.6以後就不再是這樣了。

還要注意,由於yacoby上面所說的,對於靜態變數,您可以做一些不能用const做的事情,例如,將執行期方法呼叫的結果賦給變數。

"const"和"public static"都是邪惡的!

正如KeithHum所指出的,常數不能是執行期方法的結果。而且,雖然我最初認為他說的是"可以將執行期方法呼叫的結果賦給(靜態)變數"是正確的,但我的測試表明,要做到這一點,您必須跳過一些圈。

這似乎是一個小問題,但它可能是未來災難的種子。假設在將來由於一些不可預見的原因,我被迫切換到初始化方法。如果這意味著我必須在我的控制下對檔案做一些更改,我沒有問題。但是,如果我改變了一個我已經發送給其他開發人員的庫呢?

我要寫的是,至少,如果他們想升級到我的新版本,我必須告訴其他人(以及"未來的我")對他們的檔案進行更改。在"const"的情況下,他們必須在使用它的任何地方新增"$"。在其他場景中,我今天的測試表明,它們可能需要做更少的更改,但也有一些更改。

假設使用物件導向的程式碼,我將遵循我在許多語言中看到的一般建議,並且需要對PHP進行額外的強調—避免任何型別的可見屬性,無論是常數、靜態還是其他任何型別的屬性。使用"getter"方法!

這看起來像是一個可笑的效能衝擊和醜陋的程式碼風格,但除非你能預測未來,否則這是唯一的出路。

請參見:tjerd visser關於如何初始化靜態變數並給它一個bump的答案。忽略他的貶低者-如果你關注的是效能,除了可能的錯誤和其他災難,然後切換到另一種語言。