0

私は現在、PHP スクリプトに取り組んでいますが、次のベスト プラクティスが何であるかわかりません。

PHP ではクラス (ユーザー) 内で複数のコンストラクターを使用できないため、引数として配列を持つコンストラクターがあります (id、name、address については、以下のコード ブロックを参照してください)。

この配列に id が含まれていないが、他の属性 (名前、アドレスなど) が含まれている場合、クラスの挿入メソッドを呼び出し、挿入された行の id をクラスの id 属性に割り当てます。ID、名前、およびアドレスを含む配列がコンストラクターに渡されると、これらの値が対応する属性に割り当てられます。

データベースでユーザーを編集したい場合は、次の方法で実装できます。

  • コンストラクターにオプションを追加して、配列内の id のみを渡し (name 属性と address 属性はありません。これらは update メソッドを呼び出すときに認識されないためです)、このインスタンスで update メソッドを呼び出します。これに関する問題は、(データベースのように) 実際のオブジェクトの適切な表現ではないインスタンスを取得していることです。たとえば、名前が設定されていないため、getName() メソッドを呼び出すことはできません。

  • 上記と同じですが、ID のみがコンストラクターに渡されるときに、データベースから他の属性をロードして、インスタンスがデータベース内のオブジェクトの正しい表現になるようにします。次に、
    このインスタンスで update メソッドを呼び出すことができます。


  • インスタンスを作成せずに更新メソッドを呼び出せるように、更新メソッドを静的にします。

最初の 2 つの点の問題は、コンストラクターで配列に渡される属性を確認する必要があるため、コンストラクターで一種のスパゲッティ コードを取得することです。

どのソリューションを選択するのが一番良いと思いますか?

コンストラクターで大量のスパゲッティ コードが発生しない、より良いアプローチがありますか?

<?php
class User
{
private $id;
private $name;
private $address;

public function __construct($data)
{
    $this->name = $data['name'];
    $this->address = $data['address'];

    if (isset($data['id'])) {
        $this->id = $data['id'];
    } else {
        $result = $this->insert();
        $this->id = $wpdb->insert_id; //Wordpress method for retrieving insert id
    }
}

public function get_id() { return $this->id; }
public function get_name() { return $this->name; }
public function get_address() { return $this->address; }

public function insert() { //insert into DB }
public function update($data) { //update in DB the $data attributes}
public function delete() { //delete from database }

public static function get_user_list()
{
    // load users from the database
    // foreach user {
    //      create User instance by passing the id, name and address values from the database in an array to the constructor of User
    //      add user instance to a result array
    // }
    // return result array
}
}

?>
4

1 に答える 1