Multiplos construtores em PHP

Hoje vamos ver como usar múltiplos construtores em PHP. Nativamente PHP não suporta overload de construtores… Mas podemos tentar simular esse comportamento … e para o usuário de nossa classe isso vai ficar transparente … Como exemplo inicial vamos criar uma classe genéria, com 3 campos, cada construtor irá inicializar um determinado número de campos, ou não inicializará nenum.

Primeiramente vamos criar o arquivo “TestMultipleConstruct.php” e vamos colocar o seguinte código nele:

<?php

class TestConstructs{
	private $field01;
	private $field02;
	private $field03;

	function __construct(){
		$args = func_get_args();
                $numberOfArgs = func_num_args();

                if (method_exists($this,$funtion='__construct'.$numberOfArgs)) {
        	     call_user_func_array(array($this,$funtion),$args);
                }

	}

	function __construct1($field01){
		$this->field01 = $field01;
		echo "<br>Field01 initialized with value: " . $this->field01 . "</br>";
	}

	function __construct2($field01, $field02){
		$this->field01 = $field01;
		$this->field02 = $field02;
		echo "<br>Field01 initialized with value: " . $this->field01 . "</br>";
		echo "<br>Field02 initialized with value: " . $this->field02 . "</br>";
	}

	function __construct3($field01, $field02, $field03){
		$this->field01 = $field01;
		$this->field02= $field02;
		$this->field03= $field03;
		echo "<br>Field01 initialized with value: " . $this->field01 . "</br>";
		echo "<br>Field02 initialized with value: " . $this->field02 . "</br>";
		echo "<br>Field03 initialized with value: " . $this->field03 . "</br>";
	}

	function __construct0(){
		echo "<br> No field iniitialized <br>";
	}

}

echo "<b><br>First object to instantiate: </br></b>";
$obj01 = new TestConstructs("Teste");

echo "<b><br>Second object to instantiate: </br></b>";
$obj01 = new TestConstructs("Teste", 5);

echo "<b><br>Third object to instantiate: </br></b>";
$obj01 = new TestConstructs("Teste", 5, 100);

echo "<b><br>fourth object to instantiate: </br></b>";
$obj01 = new TestConstructs();

?>

As funções mais importantes aqui são:
func_get_args() -> Essa função nos retorna um array com os argumentos passados para o construtor.
func_num_args() -> Essa função nos retorna o número de argumentos do construtor.
method_exists() -> Verifica se esse método realmente existe nessa classe
call_user_func_array() -> Chama o método que estamos passando … funcionam como funções de callback em C.

Basta colocar esse arquivo em seu servidor e acessa a página que você verá uma saída com esta:

First object to instantiate:

Field01 initialized with value: Teste

Second object to instantiate:

Field01 initialized with value: Teste

Field02 initialized with value: 5

Third object to instantiate:

Field01 initialized with value: Teste

Field02 initialized with value: 5

Field03 initialized with value: 100

fourth object to instantiate:

No field iniitialized

Deixe uma resposta