忽略命名空间等可以解释为什么我不能返回对静态数组的引用?有效地,这个班级是一个吸气者和二传手。我想使用静态方法,因为在整个应用程序生命周期中,类永远不需要再次实例化。
我明白我所做的可能只是“不良做法” - 对此事的任何更多知识都将不胜感激。
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 :(得分: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");
正如您所见,整个链必须通过引用。如果任何一个步骤不是通过引用完成的,那么它将不起作用。
答案 1 :(得分:0)
您可以通过引用来返回静态数组:
$ref = &self::$global_registry[$key];
您需要像这样访问它:
$keyVal = ®istry::get($key);
答案 2 :(得分:-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;
}
}