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中也没有。