1

我的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 在初始化之前不得访问

我了解错误消息的含义。

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

4

2 回答 2

1

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

撇开这一点不谈,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()乍一看并不十分明智,但当然不知道你的具体约束。

于 2021-10-15T13:28:44.570 回答
0

如果您将变量创建为

$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();

结果是

在此处输入图像描述

于 2021-10-15T13:28:56.703 回答