我正在尝试设计一个类,该类将具有一个静态"消息流",其实例可以对其进行读写。此消息流必须是一个外部变量,因为(通常)它将是一个$_SESSION
变量。想法是这样的:
class Streamer {
protected static $_message_stream = null; // A message stream (array)
public function __construct(){
// Blah blah blah
}
/* Set a message stream, usually a global or session variable. */
public static function setMessageStream(&$stream){
static::$_message_stream = $stream;
}
/* Add a session message to the session message stream */
public static function addMessage($type, $message){
$alert = [
"type" => $type,
"message" => $message
];
static::$_message_stream[] = $alert;
}
}
正如您所看到的,setMessageStream
接受一个引用参数。典型的用例是:
// Do this in a global configuration file
session_start();
$_SESSION['userAlerts'] = [];
Streamer::setMessageStream($_SESSION['userAlerts']);
// This would happen in a specific context
Streamer::addMessage("foo", "bar");
print_r($_SESSION['userAlerts']);
我希望输出为Array("foo" => "bar")
。相反,我得到一个空数组。为什么不起作用?
更新:这确实是与函数内部的静态变量相同的问题;t持有对singleton的引用。
所以,这就解释了"为什么"。我如何修改我的设计以实现所需的行为?具体来说,如何允许类静态地"注册"给定的外部变量以进行R/W访问?
public static function setMessageStream(&$stream){
static::$_message_stream = $stream;
}
实际上应该是
public static function setMessageStream(&$stream){
self::$_message_stream = $stream;
}
注意自我。
此外,
public static function addMessage($type, $message){
$alert = [
"type" => $type,
"message" => $message
];
static::$_message_stream[] = $alert;
}
应该再次是:
public static function addMessage($type, $message){
$alert = [
"type" => $type,
"message" => $message
];
self::$_message_stream[] = $alert;
}
您还应该注意,由于您是通过引用进行赋值的,因此您将修改变量的实际值(到目前为止,情况并非如此,只是指出它以供将来参考。)