将字符串计算为PHP代码?

将字符串计算为PHP代码?,php,eval,Php,Eval,我有一个字符串,我想让PHP作为一段代码来读取。原因是我想提前为PHP构建一组指令,然后在以后执行它。目前我有: $string = '$this->model_db->get_results()'; 期望的结果是: $string2 = $this->model_db->get_results(); http://php.net/manual/en/function.eval.php <?php $string = 'cup'; $name =

我有一个字符串,我想让PHP作为一段代码来读取。原因是我想提前为PHP构建一组指令,然后在以后执行它。目前我有:

$string = '$this->model_db->get_results()';
期望的结果是:

$string2 = $this->model_db->get_results();

http://php.net/manual/en/function.eval.php

<?php
    $string = 'cup';
    $name = 'coffee';
    $str = 'This is a $string with my $name in it.';
    echo $str. "\n";
    eval("\$str = \"$str\";");
    echo $str. "\n";
?>

或者在您的情况下:

<?php
    $string = "\$string2 = \$this->model_db->get_results();";
    // ... later ...
    eval($string);
    // Now $string2 is equal to $this->model_db->get_results()
?>

您可以有一个变量/函数,但不能有变量方法链。但是,您可以使用变量/函数创建方法链

查看php文档的这一页:

它显示了使用字符串作为对象或方法名的用法。根据数据源的不同,使用eval可能会导致安全漏洞

$var1 = 'model_db';
$var2 = 'get_results';

$this->$var1->$var2();

听起来您需要PHP,它执行包含PHP代码的字符串。例如:

// Now
$get_results = '$this->model_db->get_results(' . intval($id) . ');';

// Later
eval($get_results);
然而,评估通常是个坏主意。也就是说,有很多更好的方法来做你认为可以用
eval
来做的事情

在上面的示例中,您必须确保
$this
在代码调用
eval
的范围内。这意味着,如果您尝试在代码的完全不同部分中
eval($get_results)
,您可能会得到一个关于
$This
$This->model_db
不存在的错误

一个更健壮的替代方案是创建一个(在PHP 5.3及更高版本中提供):

但是如果
$this
现在不可用怎么办?简单:使其成为函数参数:

// Now
$get_results = function($that) use ($id) {
    return $that->model_db->get_results($id);
};

// Later
call_user_func($get_results, $this);

如果
eval
是您任务的解决方案,那么您肯定做得不对,您使用的是什么版本的PHP?@user971824是的,eval是有效的,但不是好的做法。请参阅我的答案以获取替代方案。尽管说实话,对于您试图实现的目标,可能有一个更好的解决方案,而不使用上述任何一种方法。我将勾选此项,因为它更简单,可能更有效。谢谢两人的建议。
// Now
$get_results = function($that) use ($id) {
    return $that->model_db->get_results($id);
};

// Later
call_user_func($get_results, $this);