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();




