Экземпляр класса PHP не имеет всех свойств?

Я не писал 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#, это очень странно. Я ожидал, что они будут там как неопределенные, и в моем случае они будут вставлены в базу данных как нулевые (не делая свойства обнуляемыми и не устанавливая их нулевыми). Забавно, что он говорит, что объект является CustomerEntity, даже если он не имеет всех свойств.

Это действительно так работает php, или я могу как-то настроить это по-другому? Не удалось найти решение в онлайне.


person Joona Jaakola    schedule 13.02.2020    source источник
comment
Да спасибо. Так вот как работает php. Хотя я не очень доволен :)   -  person Joona Jaakola    schedule 15.02.2020