JannieT JannieT - 4 months ago 12
PHP Question

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?

Answer

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.

Comments