我有一个静态方法的类。 static方法返回一个私有的静态stdClass对象。
myclass::get() // returns stdClass object
myclass::get()->name // name is hardcoded into the class
我如何更改名称的值,如:
myclass::get()->name = 'bob';
并设置好了吗?
我尝试将对象恢复为:
return &self::$static_object;
但是这会引发语法错误。
我该怎么办?
EDIT发布了澄清代码
final class config {
private static $configs = array();
public static function get($config_name) {
if (isset($configs[$config_name])) {
return self::$configs[$config_name];
}
$file = __get_file_exists(M_CONFIGS . $config_name, 'conf.');
if ($file) {
$config = self::__scope_include($file);
if (!is_array($config) && !$config instanceof stdClass) {
/*
*
*
* FIX
*
*
*
*/
die('ERROR config.php');
}
return self::$configs[$config_name] = self::__to_object($config);
}
}
private static function __scope_include($file) {
return include $file;
}
private static function __to_object($config) {
$config = (object) $config;
foreach ($config as &$value) {
if (is_array($value)) {
$value = self::__to_object($value);
}
}
return $config;
}
}
echo config::get('people')->name; //dave
config::get('people')->name = 'bob';
echo config::get('people')->name; // should be bob, is dave
答案 0 :(得分:5)
在get()
方法中通过引用返回应该可以解决问题:
public static function &get() {
return self::$static_object;
}
但是,我认为您应该重新审视您的设计,因为这种编码非常不受欢迎,并且会导致维护和可测试性问题。
答案 1 :(得分:1)
你正在做什么以及 drrcknlsn 的答案中断Encapsulation。那很糟糕。
执行此操作的正确方法是创建 setter 方法。
public static function set($key, $value) {
// set $config property...
}
答案 2 :(得分:1)
您错过了self
中的if (isset($configs[$config_name])) {
。它应该是
if (isset(self::$configs[$config_name])) {
return self::$configs[$config_name];
}
否则每次调用config::get('people')
时,您将读取您的配置文件,该文件最有可能返回一个数组并在返回之前将其转换为对象。您在self::$configs[$config_name]
中对对象所做的任何更改都会被新创建的对象覆盖。