Cours ⇒ Cour PHP facebook twitter youtube

La programmation objet ⇒ & les méthodes magiques



Une méthode est magique est appelée automatiquement lorsqu‘un événement se produit.

Par exemple __construct est une méthode magique .elle exécute automatiquement lorsque vous instanciez la classe contenant __construct.

Les méthodes magiques __get et __set permettentde lire ou modifier des attributs qui n’existent pas ou dont l’accès est interdit.

On prend l’exemple Animal

<?php
class Animal
{
 //les attributs
 private $couleur;
public $poids;
//constructeur
public function __construct($couleur ,$poids)
{
echo"Appele constructeur ";
$this->couleur=$couleur;
$this->poids=$poids;
}
//les méthode public
public function manger()
{ }             
public function manger()
{ }                                            

public function se_deplacer()
{}                                           
 }//fin class Animal
?>

Lorsque vous créer une instance de la classe Animal,vous pouvez accéder  à l’attribut pods car il est public mais pas à l’attribut couleur car il est private

Page_utilisateur.php

< ?php
Include ’animal_class.php’ ;
$chien = new Animal('blan',50);
echo"la couleur de chien est : ".$chien->couleur;
echo"poids de chien est :".$chien->poids."<br>";
?>

Appele constructeur 

( ! ) Fatal error: Cannot access private property Animal::$couleur in C:\wamp\www\ exercieces\methode\ Page_utilisateur.php on line 35

Call Stack

#

Time

Memory

Function

Location

1

0.0045

252848

{main}( )

..\methode_magique.php:0

Maintenent ajouterles méthode magique __get et __set

Classe Animal :

<?php
class Animal
{
 //les attributs
 private $couleur;
 public $poids;
//constructeur
public function __construct($couleur ,$poids)
{
echo"Appele constructeur ";
$this->couleur=$couleur;
$this->poids=$poids;
}
//les méthode public
public function manger()
{}            
public function se_deplacer()
{}           
//les méthodes magique
public function __get($nom)
{
 if(isset($this->tab_attributs[$nom]))
{
return $this->tab_attributs[$nom];

 }
}//fin get
public function __set($nom,$valeur)
{
$this->tab_attributs[$nom]=$valeur;
}
public function __isset($nom)
{
 return isset($this->tab_attributs[$nom]);
 }             
}//fin class Animal

?>

On appelle la page Page_utilisateur.php

Afficher : Appelé constructeur la couleur de chien est : poids de chien est :50

Remarque important :

Ces méthodes se déclenchent  automatiquement si l’attributs et privé ou n’existe pas .Elle stockent dans un tableau $tab_attributs avec pour index le nom de l’attribut .La méthode__isset($attribtut) permet de savoir si l’attribut existe.

Pour supprimer une attribut ajouté par la méthode magique __set ,il faut implémenter la méthode magique __unset($attribut)ce qui supprimera l’attribut du tableau $tab_attributs.

//la méthode magique qui supprimer l'attribtus ajouter

public function __unset($nom)
{
if(isset($this->tab_attributs[$nom]))
{
 unset($this->tab_attributs[$nom]);
}

Pour les méthodes il existe deux méthodes magiques qui permettent d’appler des méthodes privé ou qui n’existe pas c’est __call et __calStatic ,method_exist() cet dernier vérifier si une méthode existe dans un objet ,elle prend en paramétre l’objet puis le nom de la méthode ,elle retourne true si la méthode existe et false sinon.

Dans notre exemple classe Animal on a une méthode pubic (manger()) et une private (se_deplacer())

Donc ajouter les méthodes magiques à notre classe :

public function __call($nom,$arguments)
{
echo"la méthode ".$nom."n'est pas accissible .Ses arguments c'est :".implode($arguments, ',')."<br>";
 if(method_exists($this,$nom))
{
$this->$nom($arguments);
 }
}
public static function __callStatic($nom ,$arguments)
{
echo"la méthode  static ".$nom." n'est pas accessibles .Ses arguments c'est :".implode($arguments, ',')."<br>";
if(method_exists(__CLASS__,$nom))
{
 echo __CLASS__.'::'.$nom.'<br>';
self::$nom($arguments);
}
}             

               

Faire appel a notre page Page_utilisateur.php

< ?php
Include ’animal_class.php’ ;
$chien = new Animal('blan',50);
$chien->manger();
$chien->se_deplacer("Créteil ");
?>

Afficher :

Appele constructeur

méthode public manger()
la méthode se_deplacer n'est pas accessibles .Ses arguments c'est :Créteil
méthode private se_deplacer()

Explication

La méthode manger’) est appeler car elle est public mais la méthode se_deplacer ($lieu) impossible d’accéder  parce que elle est private donc on fait appelle à la fonction magique __call elle va vérifier si cette méthode existe puise que c’est la cas ,alors  la méthode se_deplacer($lieu) est appeler  .

Mais si la méthode se_deplacer($lieu) est static l’appelle dans la pge est

Animal :: se_deplacer("Créteil ");

Et la méthode magique __callStatic quiest appeler .

Il existe d’autres     méthodes  magique ici

 


Changer le fond
Oregionale Skin
7astuces
Sélectionnez un Fond (11)
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces
Fond de contenu
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces