PHP通过引用返回静态变量

时间:2012-10-20 08:51:08

标签: php reference static return

忽略命名空间等可以解释为什么我不能返回对静态数组的引用?有效地,这个班级是一个吸气者和二传手。我想使用静态方法,因为在整个应用程序生命周期中,类永远不需要再次实例化。

我明白我所做的可能只是“不良做法” - 对此事的任何更多知识都将不胜感激。

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

但我刚回到原来的那个。

3 个答案:

答案 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 = &registry::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;
    }
}