2013-11-23 64 views
2

的這段代碼是從php.net手冊上的eval:

<?php 

$string = 'cup'; 
$name = 'coffee'; 

$str = 'This is a $string with my $name in it.'; 
echo $str. "<br>"; 

eval("\$str = \"$str\";"); 
echo $str. "<br>"; 

?> 

我有點無法理解這行代碼的作用是: eval("\$str = \"$str\";")

我猜測淨效應是這樣的:$str = "$str";但是,當我用這個代替eval代碼,我沒有得到相同的效果。有人可以通過這行代碼來引導我。我意識到函數帶來的漏洞。但我的興趣點僅限於理解該特定代碼行。

我想我現在我的答案 -

eval("\$str = \"$str\";")$str = "$str";是不一樣的東西。在第二種情況下,$ str的計算結果爲This is a $string with my $name in it.,在第一種情況下,相同的字符串,因爲它仍在eval結構中,因此進一步評估並且結果爲This is a cup with my coffee in it.

+0

當你運行它時,你會得到什麼輸出? –

+4

它濫用'eval'來解釋原始單引號字符串中的'$ vars',通過使用雙引號將其替換爲它們的值。我建議不要使用這個,因爲存在各種問題,比如源字符串中的'''' – Wrikken

回答

3

eval()將執行它獲得的字符串,就像它是PHP代碼一樣。

$string = 'cup'; 
$name = 'coffee'; 

這幾乎不言自明。兩個值存儲在兩個變量中,分別爲$string$name

$str = 'This is a $string with my $name in it.'; 
echo $str. "<br>"; 

這將輸出:

這是一個字符串$在它我的名字$。

請注意,該變量未擴展。變量在單引號內使用時不會插值 - 所以結果與預期相同。這記錄在here

eval("\$str = \"$str\";"); 
echo $str. "<br>"; 

這可能是什麼混淆你。我們來詳細檢查一下。裏面的eval()聲明,您具備以下條件:

"\$str = \"$str\";" 
  • \$str - 該變量逃脫\,以避免它被解釋爲一個字符串。如果從頭開始刪除反斜槓,PHP將會拋出一個Parse錯誤。
  • \"$str\"; - 此處使用變量的實際值,反斜槓用於轉義雙引號。

運行時,要執行的PHP代碼應該是這樣的:

$str = "This is a $string with my $name in it."; 

最後,你只是附和變量作爲正常的,它只是輸出:

This is a cup with my coffee in it. 

eval()功能與其他任何功能一樣,如果使用不當,可能會非常危險。本手冊警告您:

eval()語言結構非常危險,因爲它允許執行任意PHP代碼。因此不鼓勵它的使用。如果您已經仔細覈實沒有其他選擇而不是使用此構造,請特別注意不要將任何用戶提供的數據傳遞給它,而不事先進行適當的驗證。

+0

你會說這兩行代碼是相同的:''eval(「\ $ str = \」$ str \「;」);'vs'$ str =「 $ str「;' – user1720897

+0

@ user1720897:在這個特定的例子中,是的,它們是相同的,但這並不是eval的用法,[這個例子](https://eval.in/72801)可能會更好地展示它的用法。 –

+0

但是運行這兩個代碼會產生不同的輸出 - 'eval(「\ $ str = \」$ str \「;」);'outputs這是一個杯子裏裝着我的咖啡,wh ereas'$ str =「$ str」;'outputs這是一個$ string,其中包含我的$名稱。 – user1720897

1

它將字符串評估爲PHP。 通知第一串並如何不打印$字符串& $ name變量,作爲字符串由單引號(和變量的不被轉義)

通過運行eval函數相同的字符串將評估該字符串中的變量。

輸出是,

這是一個字符串$在它我的名字$。

這是一杯咖啡。

這是你得到了來自例如在頁面上解釋, http://php.net/manual/en/function.eval.php

+1

你錯過了一半的解釋......更糟的是,你只是重複了什麼手冊頁,從問題來看,OP很可能已經在閱讀了。 – zamnuts

1
$str = 'This is a $string with my $name in it.'; 

記住串插?這不會顯示變量的值,對吧?因爲變量不能用單引號引起來。現在,如果你說

eval("\$str = \"$str\";"); 

這是什麼東西做的基本上是evaluating這個PHP表達

$str="$str"; 

你看到有隻爲逃避所需的字符反斜槓。如果你把它像

eval(" \$myNewString = \"$str\"; "); 
echo $myNewString; 

它會更加明朗,因爲這參數EVAL是一個PHP表達式現在用雙引號,它會進行評估和這些變量現在將給出自己的價值,以該字符串。用單引號使用相同的表達式,並再次無法工作。

+0

你的意思是說這就是它本質上做的事情:'$ str =「$ str」;'但是當我運行這段代碼時,輸​​出結果是:這是一個$ string,其中包含我的$ name。 – user1720897