2010-03-08 71 views
23

可以使用沒有單引號或雙引號的數組像$ array [key]嗎?我認爲這是不好的,因爲如果我不使用單引號或雙引號,PHP會首先查找常量。我的一位同事告訴我,這並不重要。可以在PHP中使用array [key]嗎?

你們認爲什麼?

+3

也許你的同事意味着使用單引號還是雙引號並不重要?因爲這或多或少都是真實的(除非變量不能用單引號分析)。 – 2010-03-08 23:11:36

回答

42

它不被認爲是好的 - 即使它會在大多數情況下工作。


基本上,PHP看到這個的時候:

echo $array[key]; 

它將爲一個常數,與define定義的搜索,稱爲key - 而且,如果沒有,如果將採取'key'值。


但是,如果有這樣的事情早在你的代碼:

define('key', 'glop'); 

它不會採取

echo $array['key']; 

了;相反,它會使用key不斷的價值 - 和你的代碼是一樣的:

echo $array['glop']; 


到底,不把報價約於關鍵的名字是壞的,至少原因有二:

  • 還有就是它不會做風險你所期望的 - 這是非常糟糕的
    • 它可能,今天...
    • 但下週/月/年呢?
    • 也許,有一天,你會define錯誤名;-)
  • 這不利於性能恆定:
    • 它必須尋找一個常數,使用前'key'
    • 而且,作爲一個評論說,它會生成通知(即使禁用error_reportingdisplay_errors,該通知/警告/錯誤仍在產生,即使後來廢棄)

所以說:你不應該聽在這一點上那傢伙:他是錯的:這事一樣。


如果你需要一些「證據」,這比什麼人都可以告訴你,在計算器「更好」,你可以點他本手冊的這一部分,作爲參考:Why is $foo[bar] wrong?

+3

另外,每次PHP看到這個語法時,它都會拋出一個E_NOTICE,這有一些性能開銷。並且可能會將一些垃圾郵件寫入日誌。因爲您應該記錄並解決通知級錯誤。 – 2010-03-08 23:09:57

+3

+1對數組鍵不使用引號是愚蠢的,並且有一天會引起麻煩。 – 2010-03-08 23:10:29

+0

@Frank:true;當他們應該在那裏時使用引號的一個更好的理由! – 2010-03-08 23:11:47

2

bad practice不引用鍵值,對於一些原因:

  1. 潛在的衝突與有意義的符號名稱,如define倒是常數。
  2. 某些鍵不能不帶引號表示(例如,鍵"]")。
  3. 不良習慣可能會在以後咬你(即關於#1和#2)。
  4. 表現 - 搜索define需要時間。

如果你想避免打字各地名是你傳遞的周圍有很多的事情只是標準元素的報價,也許你會想使用對象來代替,該採取object->property語法,而不是一個$array["element"]語法。

2

除非關鍵實際上是一個常數,沒有理由不把關鍵引在引號中。

PHP的工作方式是查找所放置的常量值,但如果找不到該常量,則需要字符串表示形式。

如果有人在路上編輯你的代碼並添加一個帶有該鍵名的常量,那隻會導致更多的麻煩。

6

這是好,並添加到別人怎麼說,這將引發在大多數情況下的錯誤:

8 Notice Use of undefined constant key - assumed 'key' in file: 'index.php' on line 46 

看到PHP Manual的部分「爲什麼$ foo的[酒吧]錯誤?」在「數組做什麼和不做什麼」此頁上:http://php.net/manual/en/language.types.array.php

3

PHP Manual - Why is $foo[bar] wrong?

始終在用字符串表示的數組索引上加上引號。例如,$ foo ['bar']是正確的,而$ foo [bar]不是。但爲什麼?這是常見的遇到這種語法的舊腳本:

<?php 
$foo[bar] = 'enemy'; 
echo $foo[bar]; 
// etc 
?> 

這是錯的,但它的工作原理。原因是這段代碼有一個未定義的常量(bar)而不是一個字符串('bar' - 注意引號)。 PHP可能在將來定義常數,不幸的是,這些代碼具有相同的名稱。它的工作原理是PHP自動將一個裸露的字符串(不與任何已知符號對應的未加引號的字符串)轉換爲包含裸露字符串的字符串。例如,如果沒有定義的常量bar,那麼PHP將替換字符串'bar'並使用它。

本手冊中還有一些其他示例供您參考。

4

這是錯誤的,並會自動定義常量:但是

$var = $array[bar]; 

這種用法是正確的:

$var = "string $array[bar] ..."; 

對於PHP2兼容性這個古老的語法,仍然允許在字符串上下文。引用鍵會導致解析錯誤,除非您也在其周圍使用{花括號}。

相關問題