返回字符串并将其作为代码运行

时间:2014-06-09 17:05:46

标签: php return eval

我正在尝试创建一个Autoloader类,以便我能够自动加载所有模块。但问题是,我想从配置文件中设置全局,稍后,只需使用以下命令调用所有这些:

Autoloader::GetGlobals();

到目前为止,我有这3个文件:

的configuration.php

<?php
global $Configuration;
$Configuration['Globals'] = "Core Database Templates Directory Debugger";
?>

Autoloader.Class.php

<?php
require_once('Configuration.php');
private static $Globals = "";
private static $MakeGlobal = "global ";

public static function GetGlobals()
    {
        $ParsedGlobals = "";
        $Globals2String = explode(" ", Autoloader::$Globals);
        foreach($Globals2String as $Global)
            $Globals[] = "$".$Global;
        $DefinedGlobals = count($Globals);
        for ($i = 0; $i < $DefinedGlobals; $i++) 
        {
            $LastElement = $DefinedGlobals - 1;
            if($i != $LastElement)
                $ParsedGlobals .= $Globals[$i].", ";
            else
                $ParsedGlobals .= $Globals[$i].";";
        }
        return Autoloader::$MakeGlobal.$ParsedGlobals;
    }
?>

我得到了正确的输出:

global Core, Database, Templates, Directory, Debugger;

接下来我想把它解释为PHP代码而不是字符串,我不想使用eval() (因为我读了很多文章这说明这是最后一个使用的功能。)

所以问题是,是否可以将return的字符串作为PHP代码运行,只需将其称为Autoloader::GetGlobals();

1 个答案:

答案 0 :(得分:1)

它几乎和使用eval()一样糟糕,但有变量变量,如果你选择走这条疯狂和混乱的道路:

function foo($arg) {
   global $$arg; // note the $$
   echo "$arg / $$arg";
}

$a = 'bar';
foo('a');

输出:

a / bar