21. Classi Astratte

Le classi astratte ci permettono di specificare con esattezza quali classi e quali metodi devono obbligatoriamente essere ridefiniti da una sottoclasse per poter essere utilizzati.

La sottoclasse derivata da una classe astratta, dovrà per forza definire tali metodi astratti per far sì che l'ereditarietà venga accettata.

Se quindi decidete di costruire una classe con il solo scopo di fornire una base per altri classi derivate da essa, allora le classi astratte fanno al caso vostro.

Esempio Classe astratta

<?php

	abstract class Animale
	{
		protected $zampe;

		protected function Animale($z)
		{
			$this->zampe = $z;
		}
		
		public function numeroZampe()
		{
			echo $this->zampe;
		}

		abstract protected function suono();
	}

	class Cane extends Animale
	{
		public function Cane()
		{
			parent::Animale(4);
		}

		public function suono()
		{ echo "bau!"; }
	}

	$rex = new Cane();
	$rex->numeroZampe(); // Stampa 4
	$rex->suono(); // Stampa "bau!"

?>

Come potete notare dall'esempio soprastante, il metodo astratto "suono()" della classe astratta "Animale" è solamente dichiarato, mentre la definizione avviene direttamente nella classe derivata.

Alcuni linguaggi OOP consentono sia di dichiarare che di definire il metodo astratto nella classe base, per fornire un implementazione di default al metodo astratto, ma PHP non lo permette, obbligando a lasciare nella classe astratta solo la dichiarazione della funzione.

Se non avessimo fornito una definizione per il metodo astratto suono(), ossia dichiarando Cane in questo modo ...

Esempio senza definizione del metodo astratto

class Cane extends Animale
{
	public function Cane()
	{
		parent::Animale(4);
	}
}
... avremmo ottenuto il seguente errore :

Fatal error: Class Cane contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Animale::suono) in C:\AppServ\www\test\test.php