2012-01-03 60 views
2

我只注意到我可以使用一個變量作爲參數,如下所示:$variable = "This's a string."; function('$variable'),而不是像這樣:function('This's a string');。我可以明白爲什麼我不能做後者,但我不明白在第一個例子工作的幕後發生了什麼。PHP如何自然地預測變量中的撇號?

+3

如何'函數(「$變量」)'爲你工作? '$ variable'永遠不會被您之前設置的字符串替換。相反,字符串「$變量」將被賦予你的函數。 – sascha 2012-01-03 09:18:39

+0

@ Sn0opy謝謝。伍德斯托克說,你好...在Birdanese手語。 – 2012-01-05 01:40:30

回答

5

你聽說過formal languages的方式嗎?解析器跟蹤上下文,因此它知道期望的字符是什麼,什麼不是。

在你關閉已經打開的字符串的那一刻,你將返回到打開字符串之前的上下文(即在這種情況下,在函數調用的上下文中)。

碼的相關的PHP-內部件是:

  • the scanner接通序列之間「和」成一個不可分割的令牌。
  • the parser將單個不可分割的標記放入語義環境中。

這些是相關卡盤C code,使它的工作。它們是PHP內部工作的一部分(特別是Zend Engine)。

PHP並沒有預料到任何東西,它真的會讀取所有char字符,並且只要它在不允許的語義環境中找到意外的TOKEN,就會發出解析錯誤。

在您的情況下,它會讀取令牌'This'並且掃描程序會匹配一個新字符串。然後它繼續閱讀s,當它找到一個空格時,它將s變成constant。作爲常數和先前發現的令牌'This'一起不形成任何known reduction(可能削減解析器鏈接我給你上面描述),解析器會發出像

意外T_STRING

錯誤

你可以從該消息推斷,它是真正指的是什麼已經發現(或者它希望它找到的),所以沒什麼沒有什麼期待

你的問題本身是錯誤的,因爲變量中沒有引用(變量的標識符)。您可能在變量的值中有一個引用者。不要混淆他們。值可以是獨立的,沒有一個變量:

<?php 
'That\'s fine'; 
42; 

(這是剛剛加載這些值到內存中一個有效的PHP代碼)

0

使用這樣

function('This\'s a string');

+1

我想,這不是他想讀的。他甚至在推理上有錯誤。看到我的評論。 – sascha 2012-01-03 09:21:10

+1

他當然知道這是對的。他對推理很感興趣,如果你仔細閱讀他的問題;) – Flavius 2012-01-03 09:45:11

+0

@maxjackie是的,我注意到,這當然有效。但是,當你有一個4000行的字符串時,你可以做一個批量的替換,或者你可以使用雙引號,對嗎?無論如何,我只是想知道爲什麼當我使用單引號和$變量時沒有出現錯誤。呵呵 – 2012-01-05 01:41:51

1

功能( '$變量')不應該在" "逃逸單引號內正確

字符工作中''

字符不逃脫單引號(他們不能逃脫自己!)。

使用"",您還可以使用變量作爲字符串的一部分,所以:

$pet = 'cat' 
$myStory = "the $pet walked down the street" 

function($pet)是函數應該傳遞一個字符串