2015-09-30 409 views
-1

這是用於呈現HTML錨元素的一些PHP代碼。爲什麼這樣的:爲什麼我可以在字符串中訪問PHP對象?

$archives .= "&nbsp;<a href='" . get_year_link($archPost->year) . "' 
title='Click to go to full listing for " . $archPost->year . "' target='_blank'>[List^]</a>"; 

工作正是這樣:

$archives .= "&nbsp;<a href='" . get_year_link($archPost->year) . "' 
title='Click to go to full listing for $archPost->year' target='_blank'>[List^]</a>"; 

從C/C#和未來的這樣,我對第一個變體的偏好,因爲我覺得一個人不能只轉儲變量嫌-dab在字符串中間。顯然PHP沒有這個問題。爲什麼不?

+1

http://php.net/manual/en/language.types.string.php#language.types.string.parsing – Rizier123

+1

字符串插值不是PHP獨有,並且不再受限於腳本語言。 – mario

+1

,因爲你的字符串分隔符是「這意味着php會嘗試將任何可訪問的變量插入到字符串中,如果將分隔符更改爲'那麼你會發現$ archPost-> year將停止工作。」 – Dave

回答

3

這就是所謂的串插,這是available in C# as well

就個人而言,我發現使用字符串插值是不好的做法。它使代碼很難在IDE中讀取,並可能導致字符串的錯誤解釋。 (也許你想要一個美元符號來表示一個美元符號,而是因爲你使用雙引號",而不是單引號',你現在有一個錯誤。)我不是串聯:

$var = 'something' . $somethingElse; 

如果您使用echo ,更高性能的回聲列表,而不是連擊:

echo 'something', $somethingElse; 

的另一個問題,至少在你的例子中,是你直接傾倒數據轉換成HTML與無法逃避做背景。如果您的輸出包含保留實體,那麼您將生成無效的模糊HTML。這甚至可能導致安全問題,這取決於所使用的上下文,如XSS問題。您希望圍繞HTML中使用的任何任意數據使用htmlspecialchars()。 (或者,使用模板引擎爲您做這件事。)

+0

嘿。沒知道它:)我猜是有原因的,我分享你的看法,至於數據:這是一年,所以我不擔心逃跑:) – Axonn

+1

它應該是一年,並不意味着它我想知道有多少注射攻擊是由於那個確切的短語造成的 – ajon

+0

@ajon確切地說,一個做類似模板工作的適當文件應該是透明的。代碼將在未來傳遞到那裏,並且在實現其中的一部分時,您不必知道整個系統的所有內容。 – Brad

相關問題