PHP5 : Utilisation de méthodes magiques

15-05-2013
Laurent Bientz

Les méthodes magiques de PHP sont très utiles, elles permettent de surcharger certain éléments natifs du langage.

Si vous n'êtes pas familier avec ces méthodes, consulter la documentation officielle.

Pour notre exemple, nous allons nous baser sur une classe matérialisant un objet métier :

<?php
class Article extends FrontModel
{
    /**
     * Class variables
     */
||t||protected $_article_id;
    protected $_article_name;
    protected $_article_content;
    protected $_article_file;
    protected $_article_date_add;
    protected $_category_id;
    protected $_author_id;
    protected $_user_infos = array("mobile" => false, "desktop" => true);

    // suite de la classe...
}
?>

Cette classe représente l'objet permettant de décrire l'ensemble propriétés d'une table.

__get

Plutôt que de devoir réècrire N getters spécifiques pour l'ensemble des variables de classe, nous allons juste surcharger la méthode magique __get :

public function __get($key)
{
    return $this->{_.$key};
}

Ainsi, à partir de l'instanciation de l'objet, on peut directement accéder aux variables de classe par leurs noms comme si ces dernières étaient public.

$article = new Article();
var_dump($article->article_name);

La variable de classe public article_name n'existant pas, PHP va automatiquement chercher une surcharge de la méthode __get et lui passer en paramètre le nom de la propriété à laquelle on tente d'accéder.

__set

Par analogie, plutôt que de réécrire N setters spécifiques, nous allons surcharger la méthode magique __set :

public function __set($key,$value)
{
    if (!empty($value))
        $this->{_.$key} = $value;
}

Ainsi, à partir de notre objet, nous pouvons directement affecter une valeur à la variable de classe protected.

$article = new Article();
$article->article_name = "Test";
var_dump($article->article_name);

La variable de classe public article_name n'existant pas, PHP va automatiquement chercher une surcharge de la méthode __set et lui passer en paramètre le nom de la propriété à laquelle on tente d'accéder ainsi que la valeur que l'on souhaite lui affecter.

__toString

Afin de faciliter la vie du développeur qui souhaite avoir une vision claire et rapide de l'objet avec lequel il travaille, nous allons surcharger la méthode __toString.

public function __toString()
{
    eval ('$params = '.  var_export($this, true) . ';');
    var_dump($params);
}
public static function __set_state($array)
{
    return $array;
}

Ainsi, si nous tentons d'afficher notre objet, PHP va automatiquement chercher une surcharge de la méthode __toString et l'appeler.

$article = new Article();
$article->article_name = "title";
$article->article_name = "content";
echo $article;

Produira l'exécution du var_dump qui affichera un tableau associatif avec toutes les variables de classes de l'objet et leurs valeurs.

__call

Afin de permettre au développeurs, toujours plus de souplesse, la méthode __call est pratique car elle est appellée lorsque l'on tente d'accéder à une méthode de classe inconnue. Nous allons donc la surcharger afin de pouvoir accéder plus facilement aux clés du tableau $_user_infos.

public static function __call($name)
{
    $key = substr(strtolower($name),2);
    return (isset($key)) ? $this->_user_infos[$key] : "";
}

Ainsi, les 2 appels suivants retourneront les valeurs des clés "mobile" et "desktop" du tableau $_user_infos.

$article = new Article();
var_dump($article->isMobile()); # $_user_infos['mobile'] > false
var_dump($article->isDesktop()); # $_user_infos['desktop'] > true

Expérience utilisateur

Wandi vous propose de découvrir une nouvelle approche de la navigation sur un site web...
Êtes-vous prêt ?

Démarrer l'expérience