Wenn der linke Teil eine Objektinstanz ist, verwenden Sie ->. Ansonsten verwenden Sie ::.
Dies bedeutet, dass dies ->hauptsächlich für den Zugriff auf Instanzmitglieder verwendet wird (obwohl es auch für den Zugriff auf statische Mitglieder verwendet werden kann, von einer solchen Verwendung wird abgeraten), während ::es normalerweise für den Zugriff auf statische Mitglieder verwendet wird (obwohl es in einigen besonderen Fällen für den Zugriff auf Instanzmitglieder verwendet wird ).
Im Allgemeinen ::wird für verwendet Umfang Auflösung , und es kann entweder ein Klassennamen haben, parent, self, oder (in PHP 5.3) staticauf seiner linken Seite. parentbezieht sich auf den Umfang der Oberklasse der Klasse, in der sie verwendet wird; selfbezieht sich auf den Umfang der Klasse, in der sie verwendet wird; staticbezieht sich auf den "aufgerufenen Bereich" (siehe späte statische Bindungen ).
Die Regel ist, dass ein Aufruf mit ::genau dann ein Instanzaufruf ist, wenn:
- Die Zielmethode ist nicht als statisch und deklariert
- Zum Zeitpunkt des Aufrufs gibt es einen kompatiblen Objektkontext. Dies bedeutet, dass diese zutreffen müssen:
- Der Aufruf erfolgt aus einem Kontext, in dem
$thisvorhanden ist und
- Die Klasse von
$thisist entweder die Klasse der aufgerufenen Methode oder eine Unterklasse davon.
Beispiel:
class A {
public function func_instance() {
echo "in ", __METHOD__, "\n";
}
public function callDynamic() {
echo "in ", __METHOD__, "\n";
B::dyn();
}
}
class B extends A {
public static $prop_static = 'B::$prop_static value';
public $prop_instance = 'B::$prop_instance value';
public function func_instance() {
echo "in ", __METHOD__, "\n";
/* this is one exception where :: is required to access an
* instance member.
* The super implementation of func_instance is being
* accessed here */
parent::func_instance();
A::func_instance(); //same as the statement above
}
public static function func_static() {
echo "in ", __METHOD__, "\n";
}
public function __call($name, $arguments) {
echo "in dynamic $name (__call)", "\n";
}
public static function __callStatic($name, $arguments) {
echo "in dynamic $name (__callStatic)", "\n";
}
}
echo 'B::$prop_static: ', B::$prop_static, "\n";
echo 'B::func_static(): ', B::func_static(), "\n";
$a = new A;
$b = new B;
echo '$b->prop_instance: ', $b->prop_instance, "\n";
//not recommended (static method called as instance method):
echo '$b->func_static(): ', $b->func_static(), "\n";
echo '$b->func_instance():', "\n", $b->func_instance(), "\n";
/* This is more tricky
* in the first case, a static call is made because $this is an
* instance of A, so B::dyn() is a method of an incompatible class
*/
echo '$a->dyn():', "\n", $a->callDynamic(), "\n";
/* in this case, an instance call is made because $this is an
* instance of B (despite the fact we are in a method of A), so
* B::dyn() is a method of a compatible class (namely, it's the
* same class as the object's)
*/
echo '$b->dyn():', "\n", $b->callDynamic(), "\n";
Ausgabe:
B :: $ prop_static: B :: $ prop_static-Wert
B :: func_static (): in B :: func_static
$ b-> prop_instance: B :: $ prop_instance-Wert
$ b-> func_static (): in B :: func_static
$ b-> func_instance ():
in B :: func_instance
in A :: func_instance
in A :: func_instance
$ a-> dyn ():
in A :: callDynamic
in dynamischem Dyn (__callStatic)
$ b-> dyn ():
in A :: callDynamic
in dynamischem Dyn (__call)