从未初始化的类型 属性 中找出类型

Finding out the type from an uninitialized typed property

我的 User class 中有以下代码:

class User {
    
    public int $id = 0;
    public string $code;
    public string $name;
}

从数据库赋值$code时,需要先弄清楚var是什么类型才可以赋值,所以我在__construct函数中使用了gettype() User:

foreach($data as $key => $val) {
    settype($val, gettype($this->$key));
    $this->$key = $val;
}

然而 returns 这个错误:

Fatal error: Uncaught Error: Typed property User::$code must not be accessed before initialization

我明白错误讯息的意思。

有没有办法在设置变量之前找出变量的转换类型?

我不确定你到底想做什么,在不了解整个事情的情况下,我不会冒险对它的逻辑发表意见。

暂且不说,在未初始化的类型 属性 上使用 gettype() 是行不通的,因为 属性 在那个时候实际上没有任何价值。

但是,因为输入了属性,你可以通过反射得到属性定义的类型:

class User {
    
    public int $id = 0;
    public string $code;
    public string $name;
    
    public function __construct() {
        
        $reflect = new ReflectionClass($this);
        $props   = $reflect->getProperties();
        foreach ($props as $prop) {
            echo $prop->getType()->getName(), "\n";            
        }

    }
}

new User();

以上会 output:

int
string
string

即时执行此操作似乎开销很大,因此请确保没有更好的工具供您使用。在__construct()方法上做这种事情,乍一看不是很明智,当然我不知道你的具体限制。

如果你创建一个变量为

$foo;

然后是null直到初始化成功,所以没有类型

如果它是类型化的 属性,那么它只是未初始化,而不是 null。 我的其余回答包含一些根据评论部分收到的信息进行的实验。因此,变量或 属性 在初始化之前是 null,类型化属性除外,它们只是未初始化。

评论区提示未初始化变量不等于null。所以我写了这段测试代码:

<?php

$foo;
echo var_dump($foo === null);

并执行它

它给出警告并评估为 true,因此未初始化的变量确实是 null

由于yivi指出问题指的是一个属性,我又进行了一次实验:

<?php

class Foo {
        public $foo;
        public function __construct() {
            echo var_dump($this->foo === null);
        }
}

new Foo();

结果是