我怎么能";寄存器”;类中对外部变量的静态引用


How can I "register" a static reference to an external variable from within a class

我正在尝试设计一个类,该类将具有一个静态"消息流",其实例可以对其进行读写。此消息流必须是一个外部变量,因为(通常)它将是一个$_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;
}

您还应该注意,由于您是通过引用进行赋值的,因此您将修改变量的实际值(到目前为止,情况并非如此,只是指出它以供将来参考。)