以下代码可以正常运行并完成我想要的工作,但我很确定我正在做一些愚蠢的事情。
我正在学习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);
}
}
}
答案 0 :(得分:1)
首先,这里有一些注意事项:
eval()
。您可以非常轻松地修改代码以设置变量(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);
}
}