0

私は何年も 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の仕組みですか、それともどうにかしてこれを構成できますか? 解決策が見つかりませんでした。

4

0 に答える 0