2011-08-07 39 views
2
echo "<input type=\"text\" size=3 name=\"{$item[\"name\"]}\"/>"; 

但以下工作正常PHP爲什麼扔語法錯誤代碼

echo "<input type=\"text\" size=3 name=\"{$item['name']}\"/>"; 

按我的理解\「真的難逃」

回答

6

您不需要轉義{}內的引號。這應該被引用,因爲它意味着PHP數組$name的字符串索引"name"。如果沒有引號(或逃脫引號),name被視爲一個常量(我假設它不是),然後你有一對不屬於的引號。

OTOH,這也將是正確的:

echo "<input type=\"text\" size=\"3\" name=\"$item[name]\"/>"; 

(周圍沒有name報價,而不要{}要麼)

看到http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing


回覆:發表評論

任何不含引號的非關鍵字或$符號被視爲一個常量(因爲您可以使用define函數來定義),因此"name"(帶引號)是一個字符串,並且不帶引號的name是常數。

當這樣寫的

,但是:

echo "{$item[name]}"; 

PHP會先尋找一個不變的名稱name,那麼如果它不存在,它將使用字符串"name"。但是,它會(取決於您的設置?)也發出警告。

+0

請您詳細說明一下。我有點困惑這裏$ item是一個數組,並且需要通過字符串「name」進行索引,而不是名稱是const。 – David

+0

@大衛:參見更新 – mpen

+0

謝謝馬克。你說得很清楚。因此爲了代碼的健壯性,我甚至不應該使用echo「{$ item [name]}」;因爲如果名稱常量存在(代碼中的其他地方),評估結果將與它不存在時(名稱常量)的結果不同。 – David

1

它是你剛剛那些邊緣案件之一因翻譯而受到處理。沒什麼特別的。

$item[\"name\"],反斜槓\是非法的,不應該在那裏,所以你得到你的語法錯誤。

-1

想想逃逸

echo "<input type=\"text\" size=3 name=\"{$item[\"name\"]}\"/>"; 

後,想什麼什麼將成爲

<input type="text" size=3 name="{$item["name"]}"/>"; 

,你可以看到是錯誤的名稱屬性後,報價將在第二次試舉結束離開休息掛

+0

據我瞭解$ item [「name」]被php解釋器替換爲一個值讓我們說它是xyz,所以最終的輸出將「 ; – David

2

$item["name"]是變量的完整名稱,因此當您使用某些打印時不能建立變量名稱功能。

在這種情況下,最好連接字符串,而不是以隱式方式插入變量。例如

echo "<input type=\"text\" size=3 name=\"" . $item["name"] . "\"/>"; 

或類似

printf("<input type=\"text\" size=3 name=\"%s\"/>", $item["name"]); 
//Parameters info at http://www.php.net/manual/es/function.sprintf.php 
2

爲什麼要用"呢?它使PHP解析特殊字符,消耗更多的處理器時間。最好使用'

這樣你不必逃避所有的HTML引號,所以腳本會更好,更短,更少的處理器將用於簡單的文本處理,你只需要將文本與變量連接起來。

echo '<input type="text" size=3 name="'.$item['name'].'"/>"'; 
+0

同意這會更好。 – David

+0

+1表示建議轉換爲單引號;) – Achshar