1. ホーム
  2. php

[解決済み】PHPで複数のコンストラクタを行うための最良の方法

2022-03-25 09:58:23

質問

引数のシグネチャが一意である __construct 関数を、PHP のクラス内にふたつ置くことはできません。これを実行したいのですが。

class Student 
{
   protected $id;
   protected $name;
   // etc.

   public function __construct($id){
       $this->id = $id;
      // other members are still uninitialized
   }

   public function __construct($row_from_database){
       $this->id = $row_from_database->id;
       $this->name = $row_from_database->name;
       // etc.
   }
}

PHPでこれを行うには、どのような方法があるのでしょうか?

どのように解決するのですか?

私なら、こんな風にするかな。

<?php

class Student
{
    public function __construct() {
        // allocate your stuff
    }

    public static function withID( $id ) {
        $instance = new self();
        $instance->loadByID( $id );
        return $instance;
    }

    public static function withRow( array $row ) {
        $instance = new self();
        $instance->fill( $row );
        return $instance;
    }

    protected function loadByID( $id ) {
        // do query
        $row = my_awesome_db_access_stuff( $id );
        $this->fill( $row );
    }

    protected function fill( array $row ) {
        // fill all properties from array
    }
}

?>

次に、IDがわかっているStudentが必要な場合。

$student = Student::withID( $id );

または、DBの行の配列を持っている場合。

$student = Student::withRow( $row );

技術的には、複数のコンストラクタを作成するのではなく、静的なヘルパーメソッドを作成するだけですが、この方法でコンストラクタ内の多くのスパゲッティコードを回避することができます。