2009-08-24 124 views
2

我剛剛升級到PHP 5.3並開始爲新客戶支持舊網站。它似乎使用了很奇怪的PHP代碼,我以前沒有遇到過。

雖然試圖訪問$ _GET或$ _REQUEST變量,開發商採用了以下內容:$ {「變量名」}

我得到生成的通知,由於不確定的變量(大概是因爲PHP沒有解析$ {「variable_name」} style code)。

改變這$ _REQUEST [「變量名」]按預期工作,但我不能去通過自己的所有代碼,並修改它,因爲該網站是巨大的,並且使用proprietry佈局方法。

有誰知道是否可以打開對這些標籤/代碼塊的支持?我看了一下PHP.ini,提到了ASP風格的標籤和短標籤,但是啓用這些標籤沒有任何作用(它們看起來完全不同,我認爲它值得一試)。

+0

你可以發佈代碼示例嗎? – cmcculloh 2009-08-24 17:19:04

+2

asp風格的標籤將是<% %>。短標籤將是而不是 sshow 2009-08-24 18:02:18

回答

16

我不認爲這有什麼新的與語法:

$a = 10; 
var_dump(${"a"}); 

作品就好;-)


你的問題可能是由於這樣的事實,在此之前,register_globals是啓用(默認情況下,如果PHP < = 4.something),現在已禁用 - 這對安全性有好處!

了register_globals設置爲開,在$_REQUEST任何變量在您的應用程序自動注入作爲vartiable - 當然,實際上,這依賴於variables_order配置選項,但是這一次幾乎總是包括GET,POST和餅乾, 至少。

例如,如果有像$_GET['my_var']這樣的變量,您也將有一個$my_var變量...而這其中,也有語法${'my_var'}


考慮register_globals訪問是通過Off因爲像PHP 4.2默認情況下,在PHP應該消失6 (如果我沒記錯),我建議不要再激活它...至少,如果你有時間來校正/測試代碼...

+0

謝謝,我還沒有遇到過這種做事的方式!起初對我來說似乎很陌生,但似乎在PHP中做了一件事似乎有很多方法 – BeesonBison 2009-08-24 17:25:32

+0

有很多方法可以做一件事情^^(太多了,有些人會說^^)^^ – 2009-08-24 17:31:28

2

舊的服務器可能有REGISTER_GLOBALS。所以奇怪的括號不是問題。

REGISTER_GLOBALS把所有的變量$_REQUEST作爲常規變量在全球範圍內,這意味着你可以訪問$_REQUEST['test']可以像$test${"test"}

訪問括號語法是在默認情況下,我不相信你可以打開/關閉它。

2

register_globals很可能已打開。 {$variable_name}語法始終開啓,但register_globals$_REQUEST['variable_name']變成$variable_name

儘可能避免將其切換開 - 雖然有一個原因被長期禁止,並且它完全在PHP6中消失。

3

$ {「variable_name」}語法實際上與$ variable_name相同,只是捲曲的內容首先評估花括號。它受到PHP所有最新版本的支持,甚至是beta版本。最近版本的PHP不支持的是支持將$ _REQUEST(和其他)變量註冊爲全局變量。有啓用它的設置:

register_globals = on

,不建議在生產中使用,因爲安全問題雖然。通過一些'sed'-like工具運行你的源代碼可能會更容易,並用正則表達式替換這些用法。

5

變量的大括號語法是PHP的嵌入式部分,並且已經存在很長時間了。它存在的原因是在使用variable variables時解決數組和對象語法的歧義。

從手冊:

爲了使用可變變量 使用數組,你必須解決的 模糊問題。也就是說,如果你 寫$$一個1然後解析器需要 知道,如果你的意思是$ 1作爲 變量,或者如果你想$$一個作爲 變量,然後1指數從 一個使用變量。解決此歧義的 的語法是:第一種情況爲$ {$ a 1} ,第二種情況爲$ {$ a} 1爲 。

在幾種情況下這是一個非常方便的語法,例如使用數組或對象變量,同時使用heredoc syntax輸出內容。

我不會重複別人關於使用register_globals的建議,我只想解釋一下這種不尋常的語法。

0

register_globals從php 5.3開始被棄用,並將從php 6.0中刪除。你想要做的是使用大多數PHP IDE(zendo studio 6+)中的重構功能將變量重命名爲更合適的內容,即$_GET['variable_name']