L'héritage

Définition

L'héritage est un des grands principes de la programmation orientée objet, et PHP l'implémente dans son modèle objet. Ce principe va affecter la manière dont de nombreuses classes sont en relation les unes avec les autres.

Par exemple, lorsque vous étendez une classe, la classe fille hérite de toutes les méthodes publiques et protégées de la classe parente. Tant qu'une classe n'écrase pas ces méthodes, elles conservent leur fonctionnalité d'origine.

L'héritage est très utile pour définir et abstraire certaines fonctionnalités communes à plusieurs classes, tout en permettant la mise en place de fonctionnalités supplémentaires dans les classes enfants, sans avoir à réimplémenter en leur sein toutes les fonctionnalités communes.

En PHP, on ne peut hériter que d'une seule classe à la fois, cependant cette même classe mère peut hériter elle même d'une autre classe.
L'héritage est moins puissant en terme de fonctionnalité que la composition : Hériter d'une classe est moins puissant que de s'en servir directement.

/!\ ATTENTION /!\ On ne peut hériter que d'une seul et unique classe à la fois, cependant, une autre classe peut hériter de nous, et notre classe mère peut hériter d'une autre classe.

Utilisation

L'héritage permet de créer une classe mère dont on pourra faire hériter plusieurs classes filles avec le mot clef extends.
Vous avez sans doute remarquer que vos manager sont quasiment tous identiques, ils contiennent a chaque fois les mêmes fonctionnalités. Pourquoi ne pas faire une classe Manager contenant les fonctions de bases, dont vont hériter vos managers spécifiques ?
Exemple :
class Mother
{
	private $prop1;
	private $prop2;

	public function getProp1()
	{
		return $this->prop1;
	}
	public function getProp2()
	{
		return $this->prop2;
	}
}

class Daughter extends Mother
{
	private $prop3;
	private $prop4;


	public function getProp3()
	{
		return $this->prop3;
	}
	public function getProp4()
	{
		return $this->prop4;
	}
}
Nous avons donc une classe mère "Mother" et une classe fille "Daughter".
La classe Mother, contient 2 propriétés et 2 méthodes. La Classe Daughter contient aussi 2 propriétés et 2 méthodes.
Cependant la classe Daughter va aussi hériter des 2 propriétés et des 2 méthodes de la classe Mother, ce qui porte a 4 le nombre de propriétés et de méthodes.
Nous pouvons donc avoir accès aux propriétés et aux méthodes de la classe mère, en respectant la visibilité des éléments.
$obj = new Daughter();
$obj->getProp3();// On peut utiliser une méthode publique de Daughter
$obj->getProp2();// On peut utiliser une méthode publique de Mother

Exemple

Manager.class.php
class Manager
{
	protected $link;
	private $table;
	private $object;

	public function __construct($link, $table, $object)
	{
		$this->link = $link;
		$this->table = $table;
		$this->object = $object;
	}
	public function delete($id)
	{
		$request = "DELETE FROM ".$this->table." WHERE id='".intval($id)."'";
		mysqli_query($this->link, $request);
	}
	public function select($id)
	{
		$request = "SELECT * FROM ".$this->table." WHERE id='".intval($id)."'";
		$res = mysqli_query($this->link, $request);
		$object = mysqli_fetch_object($res, $this->object, array($this->link));
		return $object;
	}
	public function selectAll()
	{
		$request = "SELECT * FROM ".$this->table."";
		$res = mysqli_query($this->link, $request);
		$resultat = array();
		while ($object = mysqli_fetch_object($res, $this->object, array($this->link)))
		{
			$resultat[] = $object;
		}
		return $resultat;
	}
}
UserManager.class.php
class UserManager extends Manager
{
	public function __construct($link)
	{
		parent::__construct($link, 'user', 'User');
	}
	public function create($login, $password, $email, $date)
	{
		$user = new User($this->link);
		$user->setLogin($login);
		$user->setPassword($password);
		$user->setEmail($email);
		$user->setDate($date);
		$login = mysqli_real_escape_string($this->link, $user->getLogin());
		$password = mysqli_real_escape_string($this->link, $user->getPassword());
		$email = mysqli_real_escape_string($this->link, $user->getEmail());
		$date = mysqli_real_escape_string($this->link, $user->getDate());
		$request = "INSERT INTO user (login, password, email, date) ";
		$request .= "VALUES('".$login."', '".$password."', '".$email."', '".$date."')";
		mysqli_query($this->link, $request);
		if ($res)
			return $this->select(mysqli_insert_id($this->link));
		else
			throw new Exception("Internal server error");
	}
	public function update($user)
	{
		$login = mysqli_real_escape_string($this->link, $user->getLogin());
		$password = mysqli_real_escape_string($this->link, $user->getPassword());
		$email = mysqli_real_escape_string($this->link, $user->getEmail());
		$date = mysqli_real_escape_string($this->link, $user->getDate());
		$request = "UPDATE user SET ";
		$request .= "login='".$login."', ";
		$request .= "password='".$password."', ";
		$request .= "email='".$email."', ";
		$request .= "date='".$date."' ";
		$request .= "WHERE id='".$user->getId()."'";
		mysqli_query($this->link, $request);
	}
	public function selectByLogin($login)
	{
		$login = mysqli_real_escape_string($this->link, $login);
		$request = "SELECT * FROM user WHERE login='".$login."'";
		$res = mysqli_query($this->link, $request);
		$user = mysqli_fetch_object($res, 'User', array($this->link));
		return $user;
	}
}
User.class.php
class User
{
	private $id;
	private $login;
	private $password;
	private $email;
	private $date;

	public function __construct($link)
	{
		
	}
	public function getId()
	{
		return $this->id;
	}
	public function getLogin()
	{
		return $this->login;
	}
	public function getPassword()
	{
		return $this->password;
	}
	public function getEmail()
	{
		return $this->email;
	}
	public function getDate()
	{
		return $this->date;
	}
	public function setLogin($login)
	{
		$this->login = $login;
	}
	public function setPassword($password)
	{
		$this->password = $password;
	}
	public function setEmail($email)
	{
		$this->email = $email;
	}
	public function setDate($date)
	{
		$this->date = $date;
	}
}