2012-10-20 21 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; 
    } 
}