L'opérateur de résolution de portée

Décembre 2012

L'opérateur de résolution de porté : :: est utilisé en PHP pour accéder à un attribut ou à une fonction statique qui se trouve à l'intérieur d'une classe.

Prenons l'exemple de cette classe :

<?php
class Session {
	public static $key = 'user';

	public static function login($login){
		$_SESSION[self::$key] = $login;
	}

	public static function logout(){
		unset($_SESSION[self::$key]);
	}
}
?>

Pour appeler une fonction appartenant à cette classe, il faut utiliser le nom de la classe, suivi de l'opérateur de résolution de portée, suivie du nom de la fonction :

<?php
Session::login('bob');
Session::logout();
echo Session::$key;
?>

L'intérêt d'utiliser une classe avec des membres statiques pour encapsuler des fonctions et des attributs c'est de ne pas polluer l'espace de nom global. Cela permet aussi de bien isoler un groupe de fonction pour éviter d'avoir des collisions avec des fonctions qui porteraient le même nom, sans pour autant être obligé de préfixer toutes les variables et les fonctions.

En fait c'est une sorte de workaround qu'on utilise pour émuler les Namespace.

Mais PHP supporte les namespaces depuis la version 5.3, donc si votre version de PHP est assez récente il vaut mieux utiliser les namespaces qui sont justement conçus pour résoudre les problèmes cités ci-dessus.

À quoi sert static ?

Vous avez probablement remarqué le mot static dans la déclaration des fonctions à l'intérieur de la classe. Ce mot indique à PHP que la fonction ou l'attribut est statique.

Statique, par opposition à dynamique. Un membre statique est tout simplement un membre qui ne change pas en fonction de l'instance, il est relatif à la classe.

Appeler une fonction non déclarée comme statique de manière statique avec l'opérateur de résolution de portée va lever une erreur de niveau E_STRICT :

Strict Standards: Non-static method SessionDefect::login() should not be called statically

Cette erreur n'est pas très grave, mais en général ça n'est pas une mauvaise idée de suivre les conseils et d'utiliser les bonnes pratiques.

Quelle est la différence entre :: et ->

Si vous connaissez la programmation orientée objet, vous utilisez habituellement l'opérateur -> pour accéder aux membres d'un objet (un objet étant une instance d'une classe).

Dans un tout autre contexte, cet article est très intéressant : faire une todolist avec excel.

Contrairement à d'autres langages, PHP fait une différence de syntaxe entre l'appel d'une méthode statique (qu'on appelle aussi méthode de classe), et l'appel d'une méthode d'un objet instancié.

Différence entre une classe et un objet

Une classe est une sorte de plan de fabrication d'un objet. C'est comme un type de donnée que l'on peut définir soit même, en plus des types primitifs comme integer, string, bool...

Un objet est une variable dont le type est une justement une classe que vous avez définie.

Différence entre $this et self

$this est utilisé dans les méthodes d'une classe, et fait référence à l'instance courante (l'objet depuis lequel a été appelé la méthode). Cela concerne naturellement les membres dynamiques uniquement (puisque c'est relatif à l'instance). Il s'utilise toujours avec l'opérateur ->.

Pour accéder aux membres d'une classe de manière statique, on utilise le mot clé self (ex: self::)

Pour résumer, on peut dire que -> est à $this ce que :: est à self.

Encore faim ? allez lire ça : créer un effet de fausse 3d !

0 commentaire
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré