PHP5.6可以做令人惊奇的事情!我不能在_构造中使用类的静态变量

PHP5.6可以做令人惊奇的事情!我不能在_构造中使用类的静态变量,php,class,static,Php,Class,Static,为什么这个代码不起作用 final class Db { private static $data = []; private function __construct() { self::$data['host'] = 'localhost'; self::$data['user'] = 'mysql'; self::$data['passw'] = 'mysql'; self::$data['db'

为什么这个代码不起作用

final class Db
{
    private static $data = [];

    private function __construct()
    {
        self::$data['host']  = 'localhost';
        self::$data['user']  = 'mysql';
        self::$data['passw'] = 'mysql';
        self::$data['db']    = '123';
    }

    public static function test()
    {
        var_dump(self::$data);
    }
}
Db::test();
我阅读了php.net中的官方文档,但什么也没找到。 这是一个非常有趣的情况。

Pepmap modder的评论非常准确,您希望调用静态对象上的构造函数,而该静态对象不是实例化构造的。在调用测试方法之前,可以重命名该方法并显式调用它。我添加了一些代码,允许您通过传递参数进行设置

静态变量很好

final class Db
{
    private static $data = [];

    public static function initData($data = NULL) {
        if ($data) {
            self::$data = $data;
        }
        else {
            self::$data['host']  = 'localhost';
            self::$data['user']  = 'mysql';
            self::$data['passw'] = 'mysql';
            self::$data['db']    = '123';
        }
    }

    public static function test() {
        var_dump(self::$data);
    }
}
Db::initData();
Db::test();

__当实例化新实例时,在对象的作用域上触发构造。你在任何地方实例化过对象吗?如果你从未运行过构造函数,那么你的值永远不会被赋值/定义,所以。。。除了PEBKAC之外,这里的问题到底是什么?您将在任何其他5.x版本的PHP中体验到这种行为,并且在任何OOP语言中都会遇到这种情况。这一切归结为混合了静态类和对象上下文。您可以不用尝试使用类来完成所有这些。谢谢,先生。我明白了