php OOP:使用eval()构建一个字符串来访问$ GLOBALS

时间:2014-01-15 13:02:47

标签: php oop

以下代码可以正常运行并完成我想要的工作,但我很确定我正在做一些愚蠢的事情。

我正在学习OOP,并且我开始遵循一个教程,使用“Config”类为程序设置一些参数。我在其他教程中注意到了类似的东西。本教程虽然只包含一个检索配置的方法(它使用$ GLOBALS数组),但在程序运行期间不更新它。我试图添加此功能,但使用eval(),我认为这是一个nono?此外,在教程中从未解释为什么使用$ GLOBALS数组而不是仅仅使用静态变量,所以我也对此感到困惑。

这是init.php,它包含在需要访问配置选项的文件中:

<?php

$GLOBALS['config'] = array(
    'mysql' => array(
        'host' => '127.0.0.1',
        'username' => 'root',
        'password' => '123456',
        'db' => NULL
    ),
    'shell' => array(
        'exe' => 'powershell.exe',
        'args' => array(
            '-NonInteractive',
            '-NoProfile',
            '-NoLogo',
            '-Command'
        )
    )
);

spl_autoload_register(function($class){
    require_once 'classes/' . $class . '.php';
});

这是Config.php类,它有一个get和(my)set方法来访问config数组。对于set方法,我构建一个字符串,如“$ GLOBALS ['config'] ['someConfig'] ['someSubConfig'] ='newVal';”并使用eval来执行它。最终我在Config :: set('mysql / host','zzzzz')等程序中使用它;

<?php

class Config {
    public static function get($path=NULL) {

        //return all configs if not specified
        $config = $GLOBALS['config'];

        if($path) {
            //parse path to return config
            $path = explode('/', $path);

            foreach($path as $element) {
                if(isset($config[$element])) {
                    $config = $config[$element];
                } else {
                    //if config not exist
                    $config = false;
                }
            }
        }

        return $config;
    }

    public static function set($path=NULL,$value=NULL) {

        if($path) {
            //parse path to return config
            $path = explode('/', $path);

            //Start code string for eval
            $globalPosition = '$GLOBALS['."'config'".']';

            foreach($path as $element) {
                $globalPosition .= "['$element']";
            }
            $globalPosition .= "='$value';";
            //End code string

            eval($globalPosition);
            var_dump($GLOBALS);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

首先,这里有一些注意事项:

  1. 全局变量很少是一个好主意,特别是在OOP设计中(主要是因为它们非常紧密地结合了代码)。
  2. 请不要使用eval()
  3. 您可以非常轻松地修改代码以设置变量(reference using =&),而无需使用eval()。例如:

    public static function set($path = null,$value = null)
    {
        if($path)
        {
            //parse path to return config
            $path = explode('/', $path);
    
            //Start code string for eval
            $setting =& $GLOBALS['config'];
    
            foreach($path as $element)
            {
                $setting =& $setting[$element];
            }
    
            $setting = $value;
    
            var_dump($GLOBALS);
        }
    }