Quando la parte sinistra è un'istanza di oggetto, si utilizza ->
. Altrimenti, usi ::
.
Ciò significa che ->
viene utilizzato principalmente per accedere ai membri dell'istanza (sebbene possa anche essere utilizzato per accedere ai membri statici, tale utilizzo è sconsigliato), mentre di ::
solito viene utilizzato per accedere ai membri statici (sebbene in alcuni casi speciali, venga utilizzato per accedere ai membri dell'istanza ).
In generale, ::
è utilizzato per la risoluzione ambito , e può avere sia un nome di classe, parent
, self
, o (in PHP 5.3) static
alla sua sinistra. parent
si riferisce all'ambito della superclasse della classe in cui viene utilizzata; self
si riferisce all'ambito della classe in cui viene utilizzato; static
si riferisce al "campo di applicazione chiamato" (vedere i collegamenti statici tardivi ).
La regola è che una chiamata con ::
è una chiamata di istanza se e solo se:
- il metodo target non è dichiarato come statico e
- esiste un contesto oggetto compatibile al momento della chiamata, nel senso che devono essere veri:
- la chiamata viene effettuata da un contesto in cui
$this
esiste e
- la classe di
$this
è la classe del metodo chiamato o una sua sottoclasse.
Esempio:
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";
Produzione:
B :: $ prop_static: B :: $ valore prop_static
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-> din ():
in A :: callDynamic
in dyn dinamico (__callStatic)
$ B-> din ():
in A :: callDynamic
in dyn dinamico (__call)