Der Gültigkeitsbereichsoperator (auch Paamayim Nekudotayim genannt) oder in einfacheren Worten der Doppel-Doppelpunkt ist ein Kürzel, das Zugriff auf statische, konstante und überschriebene Member oder Methoden einer Klasse erlaubt.
Wenn Sie diese Elemente außerhalb der Klassendefinition ansprechen, benutzen Sie den Namen der Klasse.
Beginnend mit PHP 5.3.0 ist es möglich eine Variable als Klassenreferenz zu nutzen. Der Variablenwert kann kein Schlüsselwort (wie self, parent oder static) sein.
Paamayim Nekudotayim scheint auf den ersten Blick eine eigenartige Wahl für die Benennung eines Doppel-Doppelpunktes zu sein. Jedoch entschied sich das Zend Team ihn so zu nennen, während Sie die Zend Engine 0.5 schrieben (welche PHP 3 antreibt). Tatsächlich bedeutet das Doppel-Doppelpunkt - in Hebräisch.
Beispiel #1 :: außerhalb der Klassendefinition
<?php
class MyClass {
const CONST_VALUE = 'Ein konstanter Wert';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // Ab PHP 5.3.0
echo MyClass::CONST_VALUE;
?>
Die zwei speziellen Schlüsselwörter self und parent werden benutzt, um auf Member und Methoden von innerhalb der Klassendefinition zuzugreifen.
Beispiel #2 :: innerhalb der Klassendefinition
<?php
class OtherClass extends MyClass
{
public static $my_static = 'statische var';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // Ab PHP 5.3.0
OtherClass::doubleColon();
?>
Wenn eine abgeleitete Klasse die Definition der Methode eines Vaters überschreibt, wird PHP die Methode des Vaters nicht aufrufen. Es obliegt der abgeleiteten Klasse, ob die Methode der Vaterklasse augerufen wird oder nicht. Dies gilt ebenfalls für Konstruktoren und Destruktoren, Überladung und magische Methodendefinitionen.
Beispiel #3 Eine Vatermethode aufrufen
<?php
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// Die Definition des Vaters überschreiben
public function myFunc()
{
// Aber dennoch die Funktion des Vaters aufrufen
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
?>