左側がオブジェクトインスタンスの場合は、を使用します->
。それ以外の場合はを使用します::
。
これは、->
主にインスタンスメンバーへのアクセスに使用されます(ただし、静的メンバーへのアクセスにも使用できますが、そのような使用は推奨されません)が、::
通常は静的メンバーへのアクセスに使用されます(いくつかの特別な場合では、インスタンスメンバーへのアクセスに使用されます) )。
一般的に、::
のために使用されるスコープの解像度、それはいずれかのクラス名を有していてもよく、parent
、self
、または(PHP 5.3で)static
、その左側に。parent
使用されているクラスのスーパークラスのスコープを指します。self
使用されるクラスのスコープを参照します。static
「呼び出されたスコープ」を指します(レイトスタティックバインディングを参照)。
ルールは、次の::
場合に限り、次の場合にのみ、インスタンスコールであるということです。
- ターゲットメソッドが静的として宣言されておらず、
- 呼び出し時に互換性のあるオブジェクトコンテキストがあります。つまり、これらはtrueでなければなりません。
- 呼び出しは、
$this
存在するコンテキストから行われ、
- のクラス
$this
は、呼び出されるメソッドのクラスまたはそのサブクラスのいずれかです。
例:
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";
出力:
B :: $ prop_static:B :: $ prop_static値
B :: func_static():B :: func_static内
$ b-> prop_instance:B :: $ prop_instanceの値
$ b-> func_static():B :: func_static内
$ b-> func_instance():
B :: func_instance
A :: func_instance
A :: func_instance
$ a-> dyn():
A :: callDynamic
動的ダイン(__callStatic)
$ b-> dyn():
A :: callDynamic
動的ダイン(__call)