将字符串计算为 PHP 代码?

问题描述 投票:0回答:3

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

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

期望的结果是:

$string2 = $this->model_db->get_results();
php codeigniter eval
3个回答
4
投票

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

检查 php 文档的此页面: http://php.net/manual/en/language.variables.variable.php

它显示了使用字符串作为对象或方法名称的用法。使用 eval 可能会导致安全漏洞,具体取决于数据源。

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

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

4
投票

听起来您想要 PHP 的 eval 函数,它执行包含 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 及更高版本中可用):

// 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);

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()
?>
© www.soinside.com 2019 - 2024. All rights reserved.