L'op�rateur de r�solution de port�e (::)
L'op�rateur de r�solution de port�e (aussi appel� Paamayim Nekudotayim) ou, en termes plus simples, le symbole "double deux points" (::), fournit un moyen d'acc�der aux membres statiques ou constants ainsi qu'aux �l�ments red�finis par la classe.
Lorsque vous r�f�rencez ces �l�ments en dehors de la d�finition de la classe, utilisez le nom de la classe.
Depuis PHP 5.3.0, il est possible de r�f�rencer une classe en utilisant une variable. La valeur de la variable ne peut �tre un mot cl� (e.g. self, parent et static).
Paamayim Nekudotayim peut sembler un choix �trange pour un double deux points. Cependant, au moment de l'�criture du Zend Engine 0.5 (fourni avec PHP 3), c'est le nom choisi par le groupe Zend. En fait, cela signifie un double deux points... en h�breu !
Exemple #1 :: en dehors de la d�finition de la classe
<?php
class MyClass {
const CONST_VALUE = 'Une valeur constante';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Depuis PHP 5.3.0
echo MyClass::CONST_VALUE;
?>
Deux mots-cl� sp�ciaux, self et parent, sont utilis�s pour acc�der aux membres ou aux m�thodes depuis la d�finition de la classe.
Exemple #2 :: depuis la d�finition de la classe
<?php
class OtherClass extends MyClass
{
public static $my_static = 'variable statique';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // Depuis PHP 5.3.0
OtherClass::doubleColon();
?>
Lorsqu'une classe �tendue red�finit une m�thode de la classe parente, PHP n'appellera pas la m�thode d'origine. Il appartient � la m�thode d�riv�e d'appeler la m�thode d'origine en cas de besoin. Cela est �galement valable pour les d�finitions des constructeurs et destructeurs, les surcharges et les m�thodes magiques.
Exemple #3 Appel d'une m�thode parente
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// D�passement de la d�finition parent
public function myFunc() {
// Mais appel de la fonction parent
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>