以下の記述は、PHP 4 以降でのみ有効です。
基底クラスの関数や変数を参照したり、まだ特定のインスタンスを持たない クラスの関数を参照したりできると便利であるような場合があります。 演算子 :: はこのような場合に使用されます。
<?php
class A
{
function example()
{
echo "オリジナルの関数A::example().<br>\n";
}
}
class B extends A
{
function example()
{
echo "再定義された関数B::example().<br>\n";
A::example();
}
}
// クラスAのオブジェクトはありません
// この例は、「オリジナルの関数A::example().<br>」を出力しま
// す
A::example();
// クラスBのオブジェクトを作成
$b = new B;
// この例の出力は次のようになります。
// 再定義された関数B::example().<br>
// オリジナルの関数A::example().<br>
$b->example();
?>
上の例では、関数example()がクラスAでコールされていますが、クラスA のオブジェクトはありません。このため、$a->example()のように書くこと はできません。代わりに、example()を「クラス関数」、つまり、そのク ラスのオブジェクトではなく、クラス自体の関数としてとしてコールしま す。
クラス関数はありますが、クラス変数はありません。実際、コールをする 時点ではオブジェクトは存在しません。つまり、クラス関数はどのオブジェ クト変数も使用することはできません。(しかし、ローカル変数やグロー バル変数は使用可能です。)また、$thisを 使用することはできません。
上の例では、クラスBは関数example()を再定義しています。クラスAの元 の定義は隠され、::演算子を使用してクラスAのexample()の実装を明示的 に参照しない限り利用できなくなっています。これを行うには、 A::example()と書いてください。(実際には、次節で示すように parent::example()と書く必要があります。)
この状況では、カレントのオブジェクトがあり、オブジェクト変数を保持 することが可能です。つまり、オブジェクト関数の内部で使用された場合、 $thisおよびオブジェクト変数を使用することが可能です。