我有一个字符串,我希望将PHP读作一段代码。原因是我想提前为PHP构建一组指令,然后再执行它。目前我有:
$string = '$this->model_db->get_results()';
期望的结果是:
$string2 = $this->model_db->get_results();
答案 0 :(得分:4)
你可以拥有一个变量/函数,但是不能有可变的方法链。但是,您可以使用变量/函数创建方法链。
检查php文档的这个页面: http://php.net/manual/en/language.variables.variable.php
它显示了使用字符串作为对象或方法名称的用法。使用eval可能会导致安全漏洞,具体取决于数据来源。
$var1 = 'model_db';
$var2 = 'get_results';
$this->$var1->$var2();
答案 1 :(得分:4)
听起来你想要PHP eval function,它执行包含PHP代码的字符串。例如:
// Now
$get_results = '$this->model_db->get_results(' . intval($id) . ');';
// Later
eval($get_results);
但是, eval通常是一个坏主意 。也就是说,有更好的方法来处理您可能认为与eval
有关的事情。
在上面的示例中,您必须确保$this
在调用eval
的代码中的范围内。这意味着如果您在代码的完全不同部分尝试eval($get_results)
,则可能会收到有关$this
或$this->model_db
不存在的错误。
更强大的替代方法是创建anonymous function(在PHP 5.3及更高版本中可用):
// Now
$that = $this;
$get_results = function() use ($that, $id) {
return $that->model_db->get_results($id);
};
// Later
call_user_func($get_results);
但如果$this
现在不可用怎么办?简单:将其设为函数参数:
// Now
$get_results = function($that) use ($id) {
return $that->model_db->get_results($id);
};
// Later
call_user_func($get_results, $this);
答案 2 :(得分:1)
<强> 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()
?>