簡體   English   中英

PHP靜態類返回引用

[英]PHP static class return reference

我有一個靜態方法的類。 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

get()方法中通過引用返回應該做的訣竅:

public static function &get() {
    return self::$static_object;
}

但是,我認為您應該重新審視您的設計,因為這種編碼非常不受歡迎,並且會導致維護和可測試性問題。

你正在做什么, drrcknlsn的答案打破了封裝 那很不好。

正確的方法是創建一個setter方法。

public static function set($key, $value) {
  // set $config property...
}

你錯過了self if (isset($configs[$config_name])) { 它應該是

if (isset(self::$configs[$config_name])) {
  return self::$configs[$config_name];
}

否則,每次調用config::get('people') ,您將讀取您的配置文件,該文件最有可能返回一個數組並在返回之前將其轉換為對象。 您在self::$configs[$config_name]中對對象所做的任何更改都會被新創建的對象覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM