我有一个方法名称,存储在DB中的一列中,如下所示:
customs::nicknames($data)
这是相关课程:
class customs extends service {
function __construct() {
parent::__construct();
}
public static function nicknames($data) {
return $data;
}
}
当我以这种方式打电话时:
$merge = eval($error['custom'] . ';');
不返回$ data变量的内容。
只是尝试一下我尝试使用echo
并正确地将数组返回到字符串转换php错误。
因此,正确读取变量$data
。但为什么不返回任何东西?
如果我试图在不使用eval()
的情况下调用此方法,请执行以下操作:
$merge = customs::nicknames($data);
正确返回$data
。
那有什么不对?
为什么eval()
无法返回方法结果?我该如何解决这个问题?
答案 0 :(得分:18)
为什么 eval()无法返回方法结果?
只是因为你没有在eval
部分退回任何内容。
eval() 返回
NULL
,除非在评估的代码中调用 return ,在哪种情况下,返回传递给 return 的值。
我该如何解决这个问题?
您可以在eval
中指定变量(在给定示例中为$merge
)。例如:
eval('$merge =' . $error['custom'] . ';');
return
中的或eval
值。 E.g:
$merge = eval('return '.$error['custom'].';');
注意:请勿在实际应用中使用eval
。
eval() 语言构造 非常危险 ,因为它允许执行任意PHP代码。 因此使用它 气馁。 如果你仔细确认没有其他的 选项比使用此构造,特别注意 不要通过 任何用户都没有正确验证数据 预先。
如果 eval()是危险的,还有另一种方法可以安全地将字符串作为代码读取吗?
是的,有(实际上是):
PHP是非常动态的语言。它可以使用strings
执行以下操作:
定义和/或获取变量(从PHP 4.3支持)。例如:
$variableName = 'MyVariable';
// Create new variable with the name defined in variable $variableName
${$variableName} = 'MyValue';
//Outputs: string(7) "MyValue"
var_dump($MyVariable);
//Outputs: string(7) "MyValue"
var_dump(${'MyVariable'});
调用函数(PHP 4.3支持)。例如:
// Create function with the name defined in variable $functionName
function MyFunction($argument) {
return 'Argument passed is: '.$argument;
}
$functionName = 'MyFunction';
// Outputs:
// string(48) "Argument passed is: Calling MyFunction directly."
var_dump(MyFunction('Calling MyFunction directly.'));
// Outputs:
// string(51) "Argument passed is: Calling MyFunction with string."
var_dump($functionName('Calling MyFunction with string.'));
创建类的实例(从PHP 5.0支持)。例如:
class MyClass {
public function __construct() {
echo 'Constructing MyClass'."\n";
}
}
$className = 'MyClass';
$objFromString = new $className();
// Outputs: object(MyClass)#1 (0) {}
var_dump($objFromString);
调用静态方法(从PHP 5.0支持)。例如:
class MyClass {
public static function staticMethod() {
return 'MyClass::staticMethod called';
}
}
$staticMethodName = 'staticMethod';
// Outputs: string(28) "MyClass::staticMethod called"
var_dump(MyClass::$staticMethodName());
从PHP 5.3开始,类名也可以用string定义。例如:
class MyClass {
public static function staticMethod() {
return 'MyClass::staticMethod called';
}
}
$className = 'MyClass';
$staticMethodName = 'staticMethod';
var_dump($className::$staticMethodName());
var_dump($className::staticMethod());
调用对象的实例方法(从PHP 5.0支持)。例如:
class MyClass {
public function instanceMethod() {
return 'MyClass::instanceMethod called';
}
}
$methodName = 'instanceMethod';
$obj = new MyClass();
// Outputs: string(30) "MyClass::instanceMethod called"
var_dump($obj->$methodName());
访问对象的静态和实例属性(从PHP 5.0支持)。例如:
class MyClass {
public static $myStaticProperty;
public $myInstanceProperty;
}
$staticPropertyName = 'myStaticProperty';
$instancePropertyName = 'myInstanceProperty';
MyClass::${$staticPropertyName} = 'my static value';
$obj = new MyClass();
$obj->{$instancePropertyName} = 'my instance value';
var_dump(MyClass::${$staticPropertyName});
var_dump($obj->{$instancePropertyName});
call_user_func
和call_user_func_array
用于动态函数/方法调用。两者都有完整的记录,所以我不会在这里详细介绍。Reflection
API。遗憾的是,文档中的示例很少,但反思是一个非常大的主题。基本上,在阅读它的工作原理后使用反射并不是什么大不了的事。