Я не писал 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, или я могу как-то настроить это по-другому? Не удалось найти решение в онлайне.