php - 从未初始化的类型化属性中找出类型
问题描述
我的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 在初始化之前不得访问
我了解错误消息的含义。
有没有办法在设置变量之前找出变量的转换类型?
解决方案
我不确定您到底要做什么,并且在不了解整个事情的情况下,我不会冒险对它的逻辑发表意见。
撇开这一点不谈,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()
乍一看并不十分明智,但当然不知道你的具体约束。
推荐阅读
- unity3d - 如果我使用 https 与我的网络服务器通信,恶意玩家能否在 POST 中看到游戏发送的内容?
- perl - 如何使用 MOJO::Dom 找到网页的特定部分?
- c# - 贪婪的正则表达式找到最新的大括号
- javascript - 更换innerHTML 与 document.getElementById 使用 var
- codeigniter - 模型和控制器查询以将 timein 和 timeout 与 codeigniter 中的单行合并
- c++ - 将 gcc 升级到 8/9 触发“错误:不支持的指令‘vmovdqu’”,而 gcc-7 运行正常
- python - 无法在 Jupyter 中打开 Octave
- python-3.x - 检查字符串中连续出现的次数[已解决]
- python - 如何在 Django 中动态限制 FloatField?
- python - 修复导入 Flask 蓝图时的循环导入