Modificadores y herencia de clases PHP
Las clases, propiedades y métodos se definen mediante los modificadores public, protected, private, final o abstract seguido de una declaración de variable normal.
Modificador | |
Public | Será posible utilizar esta propiedad o método en todo el script |
Private | Será posible utilizar esta propiedad o método sólo en la clase a la que pertenece |
Protected | Será posible utilizar esta propiedad o método sólo en la clase a la que pertenece, y en sus descendientes |
Final | No podrá ser sobreescrita por sus descendientes |
Abstract | Para ser usado, deberá heredarse primero |
Public
class Vehiculo { public $combustible = 7; } class Moto extends vehiculo { } $honda = new Moto(); echo $honda->combustible; // Devuelve: 7
En primer lugar creamos una clase Vehiculo. Esta clase tiene el taributo combustible.
Por defecto todas las propiedades y funciones son public, por lo que no es necesario especificar public. Con los métodos puedes no utilizar ninguna palabra y escribir directamente function.
Private
class Vehiculo { private $combustible = 7; } class Moto extends vehiculo { } $honda = new Moto(); echo $honda->combustible; // Devuelve: Error
En este caso, utilizando el modificador private, no se podrá mostrar ni modificar el atibuto combustible. Para ello, es necesario utilizar los métodos public getters y setters. Con ellos, podremos acceder a las propiedades private.
class Vehiculo { private $combustible = 7; public function setCombustible($combustible){ $this->combustible = $combustible; } public function getCombustible(){ return $this->combustible; } } class Moto extends vehiculo { } $honda = new Moto(); $honda->setCombustible(9); echo $honda->getCombustible(); // devuelve 9
En caso de que queramos modificar un valor private desde un objeto que a su vez es una instancia de otro, PHP creará una variable pública y otra privada.
class Vehiculo { private $modelo = 'No definido'; } class Moto extends vehiculo { } $honda = new Moto(); $honda->modelo = "GRX-1000"; var_dump($honda); //Devuelve: ["modelo":"Vehiculo":private]=> string(11) "No definido" ["modelo"]=> string(8) "GRX-1000"
Ahora hay dos variables creadas, lo cual puede resultar complicado de manejar, o por lo menos, lioso. Por eso, en estos casos, podremos utilizar el modificador protected.
Protected
Tanto las propiedades como los métodos a los que pongamos protected, podrán ser accesibles a través de la clase dónde se crean, pero también desde sus descendientes:
class Vehiculo { protected $modelo = 'No definido'; protected function estacionar(){ return "Vehículo estacionado"; } } class Moto extends vehiculo { public function setModelo($modelo){ $this->modelo = $modelo; } public function getModelo(){ return $this->modelo; } public function estacionarMoto(){ return $this->estacionar(); } } $honda = new Moto(); echo $honda->getModelo(); // Devuelve: GRX-1000 echo $honda->estacionar(); // Devuelve: Error echo $honda->estacionarMoto(); // Devuelve: Vehículo estacionado $honda->modelo = "GRX-1000"; // Devuelve: Error $honda->setModelo("GRX-1000"); //Funciona
Final
Se establece así, que un método o clase no podrá ser sobreescrito por una clase hija.
class Vehiculo { protected $modelo = 'No definido'; final function estacionar(){ return "Vehículo estacionado"; } } class Moto extends vehiculo { public function estacionar(){ return "Moto estacionada"; } } $honda = new Moto(); echo $honda->estacionar(); // Devuelve: Error
Esto mismo ocurre si se quiere heredar la misma clase:
final class Vehiculo { protected $modelo = 'No definido'; final function estacionar(){ return "Vehículo estacionado"; } } class Moto extends vehiculo { public function estacionar(){ return "Moto estacionada"; } } $honda = new Moto(); // Devuelve: Error
Abstract
Este modificador establece que la clase o método nunca podrá ser instanciada, sólo heredada.
abstract class Clase1 { // code } class Clase2 extends Clase1 { // code } abstract class Clase3 extends Clase2 { // code }
Si se define un método abstract en una clase, la propia clase deberá ser abstract también.
abstract class Vehiculo { public function estacionar(){ return "Vehículo estacionado"; } abstract public function getCombustible(); } class Moto extends vehiculo { protected $combustible; public function getCombustible() { return $this->combustible; } } $honda = new Moto(); echo $aparcado = $honda->estacionar(); // Devuelve: Vehículo estacionado $potencia = $audi->getPotencia();