2012-07-18 128 views
2

我正在想出一個函數,它將根據它的調用方式返回。是否有可能知道該函數是否在PHP中的eval()中調用?

如果我從一個php類或函數內調用該函數,它將返回一個數組,而如果從eval()語句中調用它,則它將返回一個字符串。

說的功能是:

function GetName(){ 
    return isEval ? 'John Doe' : array('John','Doe'); 
} 

是否有可能與一些替代isEval來檢測,如果它是從eval()內叫什麼名字?

更新: 這將成爲CMS系統的一部分。我需要提供一些已經內置的功能來公開發布。我知道使用eval()會產生安全風險,但仍然想知道它是否可能。

傳入參數肯定能正常工作,但如上所述,不想因提供該選項而被濫用。

+0

我認爲它最容易傳遞一個參數:'功能的GetName($格式)' – 2012-07-18 08:32:52

+0

如果你給的大局觀,我很確定有一種方法可以避免函數返回兩個不同的值,並且完全使用eval。 – JJJ 2012-07-18 08:34:23

+2

我不確定,但我確信你不應該使用'eval()'。 – Leri 2012-07-18 08:34:29

回答

3

唯一包含您想要的信息的函數是debug_backtrace。所以,你可以這樣做:

function getName(){ 
    $debug = debug_backtrace(); 

    //check $debug array. I think it should 
    //be in the 2nd element of array: 
    if ($debug[1]['function'] == 'eval') { 
     //Do Eval stuff. 
    } 
} 
+0

剛剛嘗試過這種方法併發揮了魅力。好的電話,非常感謝! – code90 2012-07-18 08:57:28

+0

不客氣。 :-) – Leri 2012-07-18 08:58:07

+1

@PLB OMG,你願意嫁給我嗎? :) – Fluffeh 2012-07-18 09:01:49

0

爲什麼不在你的函數中添加一個參數?如果是eval則爲true,否則爲false。

function GetName(eval){ 
    if(eval) 
     //TODO IF EVAL 
    else 
     //TODO IF NOT EVAL 
} 
0

當你從evaltrue作爲參數調用,下面的函數應該工作。

function GetName(isEval = false){ 
    return isEval ? 'John Doe' : array('John','Doe'); 
} 
0

這裏給出兩個答案已經,這傳遞參數的功能,它讓我思考過載功能,所以你可以親自傳遞另一種說法表明它沒有通過eval()傳遞,當然還有PHP doesn't support function overloading

但是您可以編寫函數來接受可選參數,然後使用func_num_args()和func_get_arg()來確定已發送的內容。如果沒有發送可選參數,則可以輕鬆安全地假定它是eval()'ed,並且可以使其適用。

+0

問題是我不想做出任何假設。 PLB的解決方案適用於這種情況。不管怎麼說,還是要謝謝你。 – code90 2012-07-18 08:59:33

+0

@ code90是的,我在你接受之前提出了他的答案,我不知道你能做到這一點 - 因此我也+回覆了這個問題,因爲我學到了一些有用的東西,以後可以回頭參考。 – Fluffeh 2012-07-18 09:00:59

+0

這就是這個網站的美麗。每個人都放置並獲得一些東干杯... – code90 2012-07-18 09:02:23

0
function isEval() 
{ 
    foreach(array_reverse(debug_backtrace()) as $v) { 
     return $v['function'] === 'eval'; 
    } 
} 

function isEval() { // updated by code90 
    foreach(array_reverse(debug_backtrace()) as $v) { 
     if($v['function'] === 'eval') return true; 
    } 

    return false; } 


function myFunc() 
{ 
    return isEval() ? "is eval\n" : "is not eval\n"; 
} 

function callAnotherFunction() 
{ 
    return myFunc(); 
} 

function myFunctionWithEval() 
{ 
    eval('$return = myFunc();'); 
    return $return; 
} 

測試

echo "myFunc() without eval: " . myFunc(); 
eval("echo 'myFunc() whit eval: ' . myFunc();"); 

echo "callAnotherFunction() without eval: " . callAnotherFunction(); 
eval("echo 'callAnotherFunction() with eval: ' . callAnotherFunction();"); 

echo 'myFunctionWithEval() with eval: ' . myFunctionWithEval(); 

輸出

myFunc() without eval: is not eval 
myFunc() whit eval: is eval 
callAnotherFunction() without eval: is not eval 
callAnotherFunction() with eval: is eval 
myFunctionWithEval() with eval: is not eval <--- PROBLEM! 

myFunctionWithEval調用myFunc的與EVAL。您無法保證它何時被稱爲eval。可以給誤報。

你應該考慮另一種方式來繼續。這種方法應該不能使用

的替代,但我總是建議不使用

function isEval() 
{ 
    return isset($GLOBALS['__MyEval']) && $GLOBALS['__MyEval'] === true; 
} 

function myFunc() 
{ 
    return isEval() ? "is eval\n" : "is not eval\n"; 
} 

function myFunctionWithEval() 
{ 
    $GLOBALS['__MyEval'] = true; 
    eval('$return = myFunc();'); 
    $GLOBALS['__MyEval'] = null; 

    return $return; 
} 

echo "myFunctionWithEval() with eval: " . myFunctionWithEval(); 
+0

您表示爲問題的行實際上不是來自eval()調用。 ??? – code90 2012-07-18 09:41:04

+0

myFunctionWithEval使用eval調用myFunc。你不能保證它什麼時候被稱爲eval.can給出誤報 – Federkun 2012-07-18 09:44:10

+0

我明白你的觀點,並且需要運行你的測試代碼來查看問題。似乎您想出的函數isEval()可能需要一些改進才能準確檢測。 – code90 2012-07-18 09:50:57

相關問題