我的User
类中有以下代码:
class User {
public int $id = 0;
public string $code;
public string $name;
}
在从数据库中分配$code
时,我需要先找出var的类型,然后才能将它赋值,所以我在__construct
函数中使用了User
。
foreach($data as $key => $val) {
settype($val, gettype($this->$key));
$this->$key = $val;
}
但是,它返回此错误:
致命错误:未登录错误:类型化属性用户::$code在初始化之前不能访问
我理解错误信息的含义。
有没有办法在变量设置之前找出变量的类型?
发布于 2021-10-15 05:28:44
我不知道你到底想做什么,如果你不知道更多的事情,我就不会冒险对它的逻辑提出意见。
撇开这一点不说,在未初始化的类型化属性上使用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-15 05:28:56
如果您将变量创建为
$foo;
然后它是null
,直到它被成功初始化,所以它没有类型。
如果它是一个类型化的属性,那么它仅仅是未初始化的,而不是空的。,我的回答的其余部分包含了一些基于评论部分收到的信息进行的实验。因此,在初始化变量或属性之前,变量或属性是null
,但类型化属性除外,这些属性都是未初始化的。
在注释部分,有人建议未初始化的变量不等于null
。所以我写了这个测试代码:
<?php
$foo;
echo var_dump($foo === null);
并执行了
它给出一个警告并计算为true
,因此未初始化的变量确实是null
。
自从伊维指出这个问题是指一项财产之后,我又进行了另一项实验:
<?php
class Foo {
public $foo;
public function __construct() {
echo var_dump($this->foo === null);
}
}
new Foo();
结果是
https://stackoverflow.com/questions/69585227
复制相似问题