phpconstructormultiple-constructors

Best way to do multiple constructors in PHP


You can't put two __construct functions with unique argument signatures in a PHP class. I'd like to do this:

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.
   }
}

What is the best way to do this in PHP?


Solution

  • I'd probably do something like this:

    <?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
        }
    }
    
    ?>
    

    Then if i want a Student where i know the ID:

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

    Or if i have an array of the db row:

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

    Technically you're not building multiple constructors, just static helper methods, but you get to avoid a lot of spaghetti code in the constructor this way.