Introduction à la POO en PHP5

Logo PHPPHP dans sa version 5 est sortie le 13 juillet 2004. Basé sur le moteur de script Zend Engine II dont la particularité est d’offrir un tout nouveau modèle objet complet, tant attendu par de nombreux développeurs.

Les nouveautés du modèle objet de PHP5

L’équipe de développement à voulu placer la programmation objet au sein de PHP5 proche du niveau que propose C++ ou Java. PHP nous offre donc aujourd’hui un modèle objet à simple héritage complet. Les évolutions sont nombreuses :

  • auto-chargement de classe;
  • ajout d’un « vrai » constructeur et d’un destructeur;
  • visibilité des attributs et des méthodes;
  • accès statiques aux attributs et aux méthodes;
  • définition de constantes de classe;
  • abstraction de classes;
  • interface d’objets;
  • surcharge;
  • parcours d’objets;
  • clonage d’objets;
  • déférencement des méthodes;
  • passage des objets par références par défaut.

__construct() et __destruct()

Dans sa version 4, PHP proposait déjà une méthode constructeur (méthode du même nom que la classe) qui a été redéfinie dans la version 5. Cependant, il n’y avait pas de destructeur. Ces 2 méthodes, si elles sont définies au sein de la classe, sont automatiquement appelées lors de l’instanciation de la classe et lors de la destruction de l’objet (un objet peut être détruit en utilisant delete() ou unset() et est automatiquement détruit à la fin du script).

<?php
class Bar
{
  public function __construct() {
    echo 'Je né !<br />';
  }
  public function __destruct() {
    echo 'Je meurt !';
  }
  public function doAnything() {
    echo 'Je vie !<br />';
  }
}
$obj = new Bar();
$obj->doAnything();
/**
* Affichera
* Je né !
* Je vie !
* Je meurt !
*/
?>

Visibilité

En PHP4, tous les attributs et toutes les méthodes étaient publics : ils étaient accessibles n’importe où par n’importe qui. Dans la version 5, il est possible de contrôler l’accès aux attributs et aux méthodes plus finement sur 3 niveaux :

  • public : accessible à tout le monde;
  • protected : uniquement accessible au sein de la classe mère ou d’une classe fille;
  • private : uniquement accessible au sein de la classe mère;
<?php
/* classe mère */
class A
{
  public $var1;
  protected $var2;
  private $var3;
  public function fx1(){}
  protected function  fx2(){}
  private function fx3(){}
}
/* classe fille de A */
class B extends A
{
  public $var1;
  protected $var2;
  private $var3; // erreur
  public function fx1(){}
  protected function  fx2(){}
  private function fx3(){} // erreur
}
$objA = new A();
$objA->var1;
$objA->var2; // erreur
$objA->var3; // erreur
?>

Passage par référence et clonage d’objets

En PHP4, les objets étaient passés par valeur et non par référence. Il fallait préfixer les objets par & pour utiliser la référence. Aujourd’hui ce n’est plus le cas : PHP5 passe les objets par référence par défaut.

$src->value = 'foo';
$copy = $src;
$copy->value = 'bar';
echo $src->value; // Affiche foo en PHP4 et bar en PHP5

En utilisant le mot clé clone, on force la copie explicite de l’objet et de ses valeurs.

$src->value = 'foo';
$copy = clone $src;
$copy->value = 'bar';
echo $src->value; // Affiche foo

Déférencement

En PHP4, si une méthode renvoyait un objet, on ne pouvait pas l’utiliser directement. Il fallait obligatoirement l’enregistrer dans une variable avant de pouvoir s’en servir. PHP5 permet d’utiliser directement la valeur de retour.

// PHP4
$objB = $objA->getObjB();
$objB->doAnything();
// PHP5
$objA->getObjB()->doAnything();

C’est une fonctionnalité qui est aujourd’hui utilisée dans de nombreux frameworks PHP, notament le Zend Framework, et qui permet de chainer les actions. Le codes est ainsi allégé, plus facile à lire et c’est surtout un avantage considérable pour le développeur.

Il n’est évidemment pas possible de détailler toutes les nouveautés du modèle objet de PHP5 en un seul article. J’ai choisi celles qui me semblaient être les plus importantes, tant au niveau de l’amélioration qu’elles apportent qu’en utilité. J’aurai bien sûr l’occasion de parler des autres évolutions de PHP5 dans différents articles à venir.

Laisser un commentaire pour “Introduction à la POO en PHP5

You comment, I follow Un commentaire = un lien : web-memento n'utilise pas l'attribut rel="nofollow" sur les liens de vos commentaires.

(obligatoire)

(obligatoire)