从未初始化的类型 属性 中找出类型
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();
结果是
我的 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();
结果是