首页 > 解决方案 > 从未初始化的类型化属性中找出类型

问题描述

我的User课堂上有以下代码:

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

从数据库分配$code时,我需要先找出 var 的类型,然后才能分配它,所以我gettype()__construct函数中使用 , for User

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

但是它返回此错误:

致命错误:未捕获错误:类型化属性 User::$code 在初始化之前不得访问

我了解错误消息的含义。

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

标签: phpoop

解决方案


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

撇开这一点不谈,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();

以上将输出

int
string
string

即时执行此操作似乎需要很多开销,因此请确保没有更好的工具可供您使用。在方法上做这种事情,__construct()乍一看并不十分明智,但当然不知道你的具体约束。


推荐阅读