gpt4 book ai didi

PHP 通过引用返回静态变量

转载 作者:可可西里 更新时间:2023-10-31 23:49:23 25 4
gpt4 key购买 nike

忽略命名空间等任何人都可以解释为什么我不能返回对我的静态数组的引用吗?实际上,该类是一个 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");

但我只是拿回原件。

最佳答案

执行摘要:

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

如您所见,整个链 必须通过引用。如果其中任何一步没有被引用完成,它就不会工作。

关于PHP 通过引用返回静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12986836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com