[英]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.