Php “我怎么能?”;登记册;从类中对外部变量的静态引用
我试图设计一个类,该类将有一个静态的“消息流”,其实例可以读写。此消息流必须是一个外部变量,因为(通常)它将是一个会话变量。这个想法是这样的:Php “我怎么能?”;登记册;从类中对外部变量的静态引用,php,oop,pass-by-reference,static-methods,static-members,Php,Oop,Pass By Reference,Static Methods,Static Members,我试图设计一个类,该类将有一个静态的“消息流”,其实例可以读写。此消息流必须是一个外部变量,因为(通常)它将是一个会话变量。这个想法是这样的: class Streamer { protected static $_message_stream = null; // A message stream (array) public function __construct(){ // Blah blah blah } /* Set a
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']);
我希望输出是数组(“foo”=>“bar”)
。相反,我得到一个空数组。为什么这样不行
更新:这确实是与中相同的问题
所以,这就解释了“为什么”。如何修改我的设计以达到预期的行为?具体来说,如何允许类静态地“注册”给定的外部变量以进行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;
}
您还应该注意,因为您是通过引用赋值的,所以您将修改变量的实际值(目前情况并非如此,只是指出它以供将来参考。)考虑对代码进行一些更改以删除引用。嗯,这似乎没有帮助-至少在PHP 5.4.19中没有。在5.6.5中也没有。