Lorsque la partie gauche est une instance d'objet, vous utilisez ->
. Sinon, vous utilisez ::
.
Cela signifie que ->
est principalement utilisé pour accéder aux membres d'instance (bien qu'il puisse également être utilisé pour accéder aux membres statiques, cette utilisation est déconseillée), alors que ::
est généralement utilisé pour accéder aux membres statiques (bien que dans quelques cas particuliers, il soit utilisé pour accéder aux membres d'instance).
En général, ::
est utilisé pour résolution du champ d'application et il peut avoir un nom de classe, parent
, self
ou (en PHP 5.3) static
à sa gauche. parent
fait référence à l'étendue de la superclasse de la classe où il est utilisé ; self
fait référence à la portée de la classe dans laquelle il est utilisé ; static
fait référence à la "portée appelée" (voir liaisons statiques tardives ).
La règle est qu'un appel avec ::
est un appel d'instance si et seulement si :
- la méthode cible n'est pas déclarée comme statique et
- il existe un contexte d'objet compatible au moment de l'appel, ce qui signifie que ces éléments doivent être vrais :
- l'appel est effectué à partir d'un contexte où
$this
existe et
- la classe de
$this
est soit la classe de la méthode appelée, soit une sous-classe de celle-ci.
Exemple :
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";
Sortie :
B::$prop\_static: B::$prop\_static value
B::func\_static(): in B::func\_static
$b->prop\_instance: B::$prop\_instance value
$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 dynamic dyn (\_\_callStatic)
$b->dyn():
in A::callDynamic
in dynamic dyn (\_\_call)
3 votes
Duplicata possible de Référence - Que signifie ce symbole en PHP ?
1 votes
Duplicata possible de Différence entre les opérateurs double-col et flèche en PHP ?