私は何年も php を書いていませんでしたが、今は戻ってきました。新しい機能とより厳密な型付けが見られるのは良いことです。私はphp 7.4を使用していますが、奇妙な問題が発生しています。データベース テーブルのデータを表すモデルがあります (列名とプロパティ名が一致します)。クラス定義からinsert 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)
その後、エンティティは配列に変換され、execute に渡されます。
$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の仕組みですか、それともどうにかしてこれを構成できますか? 解決策が見つかりませんでした。