Modificadores y herencia de clases PHP

Modificadores y herencia de clases PHP

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

Related Posts

Leave a reply