2012-10-20 23 views
4

忽略命名空間等任何一個可以解釋爲什麼我不能返回對我的靜態數組的引用?這個班級實際上是一個吸氣和二傳手。我想使用靜態方法,因爲在整個應用程序生命週期中,類永遠都不需要再次實例化。PHP通過引用返回靜態變量

我明白我在做什麼可能只是「不好的做法」 - 任何關於此事的更多知識將不勝感激。

namespace xtend\core\classes; 
use xtend\core\classes\exceptions; 

class registry { 

private static $global_registry = array(); 

private function __construct() {} 

public static function add($key, $store) { 
    if (!isset(self::$global_registry[$key])) { 
     self::$global_registry[$key] = $store; 
    } else { 
     throw new exceptions\invalidParameterException(
      "Failed to add the registry. The key $key already exists." 
     ); 
    } 
} 

public static function remove($key) { 
    if (isset(self::$global_registry[$key])) { 
     unset(self::$global_registry[$key]); 
    } else { 
     throw new exceptions\invalidParameterException(
      "Cannot remove key $key does not exist in the registry" 
     ); 
    } 
} 

public static function &get($key) { 
    if (isset(self::$global_registry[$key])) { 
     $ref =& self::$global_registry[$key]; 
     return $ref; 
    } else { 
     throw new exceptions\invalidParameterException(
      "Cannot get key $key does not exist in the registry" 
     ); 
    } 
} 

} 

使用它像這樣

$test = array("my","array"); 
\xtend\core\classes\registry::add("config",&$test); 
$test2 =& \xtend\core\classes\registry::get("config"); 
$test2[0] = "notmy";  
print_r($test); 

你會假定我還是會回到

array("notmy","array"); 

但我只是找回當初。

+0

您可以通過註冊表訪問::您是否正確地使用它添加($鍵,$商店) –

+0

?見[php.net參考資料](http://php.net/manual/en/language.references.return.php) –

+0

@AlvinWong更新我的問題與我如何使用它。 –

回答

1

內容提要:

class Registry { 
    private static $global_registry = array(); 

    public static function Add($key, &$value){ 
     static::$global_registry[$key] =& $value; 
    } 
    public static function &Get($key){ 
     return static::$global_registry[$key]; 
    } 
    public static function Remove($key){ 
     unset(static::$global_registry[$key]); 
    } 
} 

$test = array("my", "array"); 
Registry::Add("config", $test); 
$test2 =& Registry::Get("config"); 
$test2[0] = "notmy";  
var_dump($test); 

這真的很簡單一旦你明白它是如何工作的:

  • 首先,add功能必須pass by reference,否則那就是在功能看到的值存儲在價值時甚至不是你已經通過了價值。

  • 其次,$global_registry,我們必須assign by reference。否則,存儲的值甚至不是函數中看到的值。

  • 第三,我們必須return by reference通過把一個符號在函數聲明。你已經這樣做了,除了這個代碼:

$ref =& self::$global_registry[$key]; // redundant line 
return $ref; 

是一樣的驗證碼

return self::$global_registry[$key]; 

因爲在該行public static function &get,我們已經宣佈的返回值是一個參考。

  • ,最後,我們需要分配引用返回的引用,你也做的事:
$test2 =& Registry::Get("config"); 

正如你所看到的,整個鏈條絕作爲參考。如果任何一個步驟不是通過引用完成的,它將不起作用。

0

您可以通過deferencing回報您的靜態數組:

$ref = &self::$global_registry[$key]; 

你需要訪問它是這樣的:

$keyVal = &registry::get($key); 
-1

您可以使用下面的代碼來試訓引用

class Apple { 

    public static $basket = [], $scripts =[]; 

    public static function addToBasket($grapes) { 
     self::$scripts =& self::AppStatic(__CLASS__ . __METHOD__, array()); 
     self::$scripts[$grapes] = ['type' => $grapes]; 
     return self::$scripts; 
    } 

    public static function &AppStatic($name, $default_value = NULL) { 
     if (isset(self::$basket[$name]) || array_key_exists($name, self::$basket)) { 
      return self::$basket[$name]; 
     } 

     if (isset($name)) { 
      return self::$basket[$name] = &$default_value; 
     } 

     $data = NULL; 
     foreach (self::$basket as $key => $value) { 
      $data[$key] = $value; 
     } 
     return $data; 
    } 
}