2010-03-09 21 views
2

This question讓我想起了裸露的琴絃。在PHP中是否有任何合法用途?

當PHP看到一個沒有用引號括起來的字符串時,它首先檢查它是否是一個常量。如果不是,它只是假定它是一個字符串,並繼續。因此,舉例來說,如果我有

echo $foo[bar]; 

如果有一個叫巴恆它使用的數組鍵,但如果沒有,那麼它把酒吧作爲裸字符串,所以它的行爲就像

echo $foo["bar"]; 

如果在將來的某個日期添加一個具有相同名稱的常量,這可能會導致各種問題。

我的問題是,是否有任何情況下,它使用裸字符串實際上是有意義的?

回答

12

不,我看不到一個有意義的單一實例,它總是很危險。應該使用不帶引號的字符串來保留常量。我不明白PHP的發明者如何決定引入這種荒謬的行爲 - 它使常量的正確使用幾乎不可能(因爲如果你嘗試訪問一個尚未定義的常量,PHP會默默地,愚蠢地產生一個字符串),而不會給任何好處。

+2

+1 ,我同意你Pekka的觀點,並且僅僅因爲PHP足夠寬容,可以將裸露的字符串轉換爲文字,並不意味着你應該養成使用它的習慣。 – 2010-03-09 01:17:19

+0

@Anthony true,加上(我編輯了我的答案)大量地破壞了常量的使用 - 你永遠不能真正依賴它們的設置,並且必須使用'defined'來檢查它們。如果一個常量沒有被定義,正確的方法是拋出一個致命的錯誤。 – 2010-03-09 01:19:58

+0

那麼,你只需報告警告級錯誤並警惕地修復它們。但它仍然是一個PITA。 – 2013-09-04 20:23:20

0

您將唯一一次使用裸露字符串作爲關鍵是如果它以前在define()中用於常量。

1

這並不可能算作是合法的,但我的朋友的tweetable證明了概念的MVC框架,TweetMVC避開在幾個景點的報價擠進去,如幾個大字:

foreach(c('mod')as$f)require"t/$f.php";@list($c,$m,$a)=explode('/',@$_GET[r],3);$c=$c?:c('dc');$o=(@include"c/$c.php")[email protected]$c($m,$a):e(1) 
相關問題