5

忽略命名空间等任何人都可以解释为什么我不能返回对我的静态数组的引用吗?实际上,该类是一个 getter 和 setter。我想使用静态方法,因为在整个应用程序生命周期中永远不需要再次实例化该类。

我知道我正在做的事情可能只是“不好的做法” - 任何关于此事的更多知识将不胜感激。

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");

但我只取回原件。

4

3 回答 3

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必须通过引用传递,否则函数中看到的值甚至不是你传入的值。

  • 其次,在存储值时$global_registry,我们必须通过引用进行赋值。否则,存储的值甚至不是函数中看到的值。

  • 第三,我们必须通过在函数声明中放置一个 & 来通过引用返回。你已经这样做了,除了这段代码:

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

与此代码相同:

return self::$global_registry[$key];

因为在这一行public static function &get中,我们已经声明了返回值是一个引用。

  • 最后,我们需要按引用分配返回的引用,您也这样做了:
$test2 =& Registry::Get("config");

如您所见,整个链必须是通过引用。如果任何一个步骤不是由裁判完成的,它就不会起作用。

于 2013-08-16T11:13:11.433 回答
0

您可以通过deferencing返回您的静态数组:

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

您需要像这样访问它:

$keyVal = &registry::get($key); 
于 2012-12-18T17:02:50.673 回答
-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;
    }
}
于 2016-12-31T11:24:50.103 回答