Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox



Les classes en php - partie 2

Compatible PHP 5. Cliquer pour en savoir plus sur les compatibilités.Par Xeon (Florian Ronzi), le 19 mars 2009

Bonjour,
Suite à mon premier article intitulé Créer sa première classe disponible sur le wiki à l'adresse suivante :
Les classes en Php - Partie 1

Je vous présente aujourd'hui la partie 2 dans lequel nous allons rentrer plus en profondeur pour voir quelques notions importantes des classes en PHP.

Entrons maintenant dans le vif du sujet en considérant que la partie 1 est bien intégrée :)

La visibilité des membres en détails

Il est question au chapitre précédent des restrictions d'accès qui peuvent s'appliquer aux membres d'une classe (ses propriétés et fonctions). On parle de leur visibilité.
La première question que je peux légitimement vous poser, quelles sont les 3 visibilités essentielles ?!
Je savais que vous saviez, mais je le redit pour le plaisir : Public, Private et Protected.
Voyons dès maintenant un cas concret pour ces 3 cas de figure.

Public



Code

class Demonstration {
 
	public $la_date;
 
	public function __construct(){
		$this->la_date = date("d-m-Y");
	}
 
}


Nous pouvons donc aisément faire :



Code

$demo = new Demonstration();
echo $demo->la_date; // 19-03-2009


En résultat nous pouvons voir que de l'extérieur de la classe nous pouvons accèder à toutes variables ou fonctions définies comme Public.

Private



Modifions maintenant notre classe Demonstration.



Code

class Demonstration {
 
	private $la_date;
 
	public function __construct(){
		$this->la_date = date("d-m-Y");
	}
 
}


Utilisons le même code de test et analysons le retour.



Code

$demo = new Demonstration();
echo $demo->la_date; // Fatal error: Cannot access private property Demonstration::$la_date in C:\Program Files\wamp\www\outils\console.php(26) : eval()'d code on line 12


Et oui, évidement la variable est maintenant de visibilité Private, ainsi il est impossible d'y accéder depuis l'extérieure de la classe.
Créons donc simplement une fonction public permettant de récupérer une variable private depuis l'extérieur.

Code

class Demonstration {
 
	private $la_date;
 
	public function __construct(){
		$this->la_date = date("d-m-Y");
	}
 
	public function getDate(){
		return $this->la_date;
	}
 
}


Et le résultat…

Code

$demo = new Demonstration();
echo $demo->getDate(); // 19-03-2009


Çà devient nettement plus clair maintenant :) Voyons donc la dernière visibilité possible.

Protected


Attention ouvrez bien vos oreilles, c'est maintenant que ça devient intéressant.
Une classe c'est un peu comme un homme… c'est très fainéant !
En résumé il lui ai intéressant de sous traiter ce qui ne l'intéresse pas.

Code

class Demonstration {
 
	private $la_date;
 
	public function __construct(){
		$this->la_date = date("d-m-Y");
	}
 
	public function getDate(){
		return $this->la_date;
	}
 
}
 
class VerifDate extends Demonstration {
 
	public function verif($date){
		if($date == $this->la_date){
			return true;
		}else{
			return false;	
		}
	}
 
}


Dès lors on modifie un peu notre de code, au lieu d'instancier Demonstration, on va instancier VerifDate et Demonstration sera automatiquement instanciée :

Code

$demo = new VerifDate();
if($demo->verif(date("d-m-Y"))){
	echo "C'est aujourd'hui !";
}else{
	echo "Ce n'est pas aujourd'hui !";
}
// Ce n'est pas aujourd'hui !


Bizarre… pourquoi la réponse nous donne Ce n'est pas aujourd'hui alors que nous donnons la même valeur à $la_date de Demonstration ( date(“d-m-Y”) ) et à $date de la fonction verif de VerifDate ( date(“d-m-Y”) ) ?
Vous avez deviné… ?
Non, alors je vous donne la réponse, tout simplement car nous avons laissé la variable $la_date en Private. C'est la qu'intervient Protected.
Quel charabia, voyons concrètement ce que ça donne :

Code

class Demonstration {
 
	protected $la_date;
 
	public function __construct(){
		$this->la_date = date("d-m-Y");
	}
 
	public function getDate(){
		return $this->la_date;
	}
 
}
 
class VerifDate extends Demonstration {
 
	public function verif($date){
		if($date == $this->la_date){
			return true;
		}else{
			return false;	
		}
	}
 
}


Cela nous donne donc…

Code

$demo = new VerifDate();
if($demo->verif(date("d-m-Y"))){
	echo "C'est aujourd'hui !";
}else{
	echo "Ce n'est pas aujourd'hui !";
}
// C'est aujourd'hui !



Ainsi pour résumer nous pouvons voir que le mot clé :

  • Public rend la variable ou la fonction accessible depuis n'importe quel endroit interne ou externe à classe.
  • Private rend la variable ou la fonction accessible uniquement depuis l'intérieur de la classe.
  • Proteced rend la variable ou la fonction uniquement accessible depuis l'intérieur ainsi qu'aux héritages.


Conclusion

C'est terminé, nous aurons donc affiné les propriétés qui sont dès lors extrêmement essentielles pour un codage propre et soigné.
Tout mettre en public n'est de loin pas la meilleure solution !

Dans la troisième et dernière partie, je vous expliquerais une méthode fondamentale des classes que dont ne pourrez plus vous passer :)

AlienFX, aka Xeon