codeigniter 将字符串作为PHP代码求值?

qjp7pelc  于 7个月前  发布在  PHP
关注(0)|答案(3)|浏览(52)

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

$string = '$this->model_db->get_results()';

字符串
期望的结果是:

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

vktxenjb

vktxenjb1#

你可以有一个可变的变量/函数,但不能有可变的方法链.然而你可以创建一个方法链使用可变的变量/函数.
查看php文档的此页:http://php.net/manual/en/language.variables.variable.php
它显示了使用字符串作为对象或方法名称的用法.使用eval可能会导致安全漏洞,具体取决于您的数据源。

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

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

字符串

7d7tgy0s

7d7tgy0s2#

听起来你需要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);

xu3bshqb

xu3bshqb3#

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()
?>

相关问题