我希望得到一个函数,它将根据它的调用方式返回。
如果我从php类或函数中调用该函数,它将返回一个数组,而如果它是从eval()
语句中调用的,那么它将返回一个字符串。
说功能如下:
function GetName(){
return isEval ? 'John Doe' : array('John','Doe');
}
是否可以将isEval替换为可以检测是否从eval()
内调用?
更新: 这将成为CMS系统的一部分。我需要提供一些已经内置的功能才能公开发布。我知道使用eval()会产生安全风险,但仍然想知道它是否有可能。
传递参数肯定能够很好地工作,但如上所述,不要因提供该选项而被滥用。
答案 0 :(得分: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.
}
}
答案 1 :(得分:0)
为什么不在函数中添加参数?如果是eval则为true,否则为false。
function GetName(eval){
if(eval)
//TODO IF EVAL
else
//TODO IF NOT EVAL
}
答案 2 :(得分:0)
当您从eval
传递true
作为参数进行呼叫时,以下功能应该有效。
function GetName(isEval = false){
return isEval ? 'John Doe' : array('John','Doe');
}
答案 3 :(得分:0)
鉴于这里已有两个答案,建议将一个参数传递给函数,它让我考虑重载函数,所以你可以亲自传递另一个参数来表明它没有通过{{1}传递但当然PHP doesn't support function overloading。
然而你可以编写你的函数来接受一个可选参数,然后使用func_num_args()和func_get_arg()来确定已发送的内容。如果没有发送可选参数,您可以轻松安全地假设它已被eval()
编辑,您可以使其相应地采取行动。
答案 4 :(得分: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使用eval调用myFunc。你无法保证什么时候被称为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();