2012-11-10 43 views
3

我有一個靜態方法的類。該靜態方法返回一個私有的靜態stdClass對象。PHP靜態類返回引用

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 
+0

* name是什麼意思是硬編碼到類中?如果夠短,發佈'get'方法。 –

回答

1

您錯過了selfif (isset($configs[$config_name])) {。它應該是

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

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

+0

謝謝!我新的它必須是簡單的東西,不能相信我錯過了哈哈:) – Ozzy

4

通過引用在get()方法返回應該做的伎倆:

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

但是,我認爲你應該重新審視你的設計,因爲這種編碼是高度皺眉,並會導致維護和可測性頭痛的道路。

+0

我不相信反對票,但你的答案[聞](http://en.wikipedia.org/wiki/Code_smell)。 –

+0

@JasonMcCreary:請在下次評論前實際閱讀我的回答。我非常清楚地建議不要使用這種代碼。 – FtDRbwLXw6

+0

您仍然提供相反的代碼。 :)花時間,並顯示*更好*的方式來做到這一點。 –

1

你在做什麼和從drrcknlsn中斷Encapsulation的答案。那很不好。

正確的方法是創建一個設置器方法。

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