14 - Sobreescritura del constructor.


Cuando creamos un objeto de una clase el primer método que se ejecuta es el constructor. Si la clase no tiene constructor pero la subclase si lo tiene, el que se ejecuta es el constructor de la clase padre:

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Operacion {
  protected $valor1;
  protected $valor2;
  protected $resultado;
  public function __construct($v1,$v2) 
  {
    $this->valor1=$v1;
    $this->valor2=$v2;
  }
  public function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
}

class Suma extends Operacion{
  public function operar()
  {
    $this->resultado=$this->valor1+$this->valor2;
  }
}

$suma=new Suma(10,10);
$suma->operar();
$suma->imprimirResultado();
?>
</body>
</html> 

La clase Suma no tiene constructor pero cuando creamos un objeto de dicha clase le pasamos dos datos:

$suma=new Suma(10,10);

Esto es así ya que la clase padre si tiene constructor:

  public function __construct($v1,$v2) 
  {
    $this->valor1=$v1;
    $this->valor2=$v2;
  }

Ahora veremos un problema que la subclase también tenga constructor, es decir sobreescribimos el constructor de la clase padre.

Problema:Implementar la clase Operacion. El constructor recibe e inicializa los atributos $valor1 y $valor2. La subclase Suma añade un atributo $titulo. El constructor de la clase Suma recibe los dos valores a sumar y el título.

pagina1.php

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Operacion {
  protected $valor1;
  protected $valor2;
  protected $resultado;
  public function __construct($v1,$v2)
  {
    $this->valor1=$v1;
    $this->valor2=$v2;
  }
  public function imprimirResultado()
  {
    echo $this->resultado.'<br>';
  }
}

class Suma extends Operacion{
  protected $titulo;
  public function __construct($v1,$v2,$tit)
  {
    parent::__construct($v1,$v2);
    $this->titulo=$tit;
  }
  public function operar()
  {
    echo $this->titulo;
    echo $this->valor1.'+'.$this->valor2.' es ';
    $this->resultado=$this->valor1+$this->valor2;
  }
}

$suma=new Suma(10,10,'Suma de valores:');
$suma->operar();
$suma->imprimirResultado();
?>
</body>
</html>

Nuestra clase Operacion no a sufrido cambios. Veamos ahora la clase Suma que añade un atributo $titulo y constructor:

  public function __construct($v1,$v2,$tit)
  {
    parent::__construct($v1,$v2);
    $this->titulo=$tit;
  }

El constructor de la clase Suma recibe tres parámetros. Lo primero que hacemos es llamar al constructor de la clase padre que tiene por objetivo inicializar los atributos $valor1 y $valor2 con la siguiente sintaxis:

    parent::__construct($v1,$v2);

Mediante la palabra clave parent indicamos que llamamos el método __construct de la clase padre. Además utilizamos el operador ::.

El constructor de la clase Suma carga el atributo $titulo:

    $this->titulo=$tit;

Ahora cuando creamos un objeto de la clase Suma debemos pasar los valores a los tres parámetros del constructor:

$suma=new Suma(10,10,'Suma de valores:');
$suma->operar();
$suma->imprimirResultado();

Si nos equivocamos y llamamos al constructor con dos parámetros:

$suma=new Suma(10,10);

Se muestra un warning:

Warning: Missing argument 3 for Suma::__construct()

Retornar