0

我已经多年没有写 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 的工作原理,还是我可以以其他方式配置它?在线找不到解决方案。

4

0 回答 0