3

静的メソッドを持つクラスがあります。static メソッドは、private static stdClass オブジェクトを返します。

myclass::get() // returns stdClass object
myclass::get()->name // name is hardcoded into the class

次のように名前の値を変更するにはどうすればよいですか。

myclass::get()->name = 'bob';

そしてそれは設定されていますか?

次のようなオブジェクトを返そうとしました:

return &self::$static_object;

しかし、それは構文エラーをスローします。

私に何ができる?

明確化のために投稿されたコードを編集します

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
4

3 に答える 3

5

メソッドで参照によって返すと、get()うまくいくはずです。

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

ただし、この種のコーディングは非常に嫌われており、将来的にメンテナンスとテスト容易性の問題が発生するため、設計を再検討する必要があると思います。

于 2012-11-10T20:40:43.867 に答える
1

あなたがしていることとdrrcknlsnからの答えはカプセル化を破ります。それは悪いことです。

これを行う正しい方法は、setterメソッドを作成することです。

public static function set($key, $value) {
  // set $config property...
}
于 2012-11-10T20:44:13.387 に答える
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]、新しく作成されたオブジェクトによって上書きされます。

于 2012-11-10T21:33:05.103 に答える