我已经多年没有写 php,但现在我回来了。很高兴看到新功能和更严格的输入。我正在使用 php 7.4,但遇到了一个奇怪的问题。我有一个表示数据库表中数据的模型(列名和属性名匹配)。我正在从类定义中创建一个插入 sql 语句,这意味着它正在插入所有属性(主键“Id”除外)。然后将整个模型传递给 PDOStatement 执行命令。
假设表是 Customer,类是 CustomerEntity:
class CustomerEntity
{
public int $Id;
public string $Name;
public ?string $Email;
public bool $Active;
}
这将转换为以下 SQL 插入:
INSERT INTO Customer (Name,Email,Active) VALUES (:Name,:Email,:Active)
然后将实体转换为数组并传递给执行。
$statement = $this->Connection->prepare($command);
return $statement->execute($params);
当所有属性都设置好时,这可以正常工作。但是当没有设置某些东西时,就会出现错误:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
归结为当您执行这样的 var_dump 时:
$entity = new CustomerEntity();
$entity->Name = "John";
var_dump($entity);
它给你这个:
object(CustomerEntity)
public 'Name' => string 'John' (length=4)
因此,未在类上定义的属性消失了。来自其他强类型语言的世界,比如 C#,这很奇怪。我希望它们以未定义的形式存在,在我的情况下,它们将作为 null 插入到数据库中(而不使属性可以为 null 并将它们设置为 null)。说对象是 CustomerEntity 有点好笑,即使它没有所有属性。
这真的是 php 的工作原理,还是我可以以其他方式配置它?在线找不到解决方案。