以下のシナリオで、クラス定数とインスタンス変数の継承方法に違いがある理由をよりよく理解したいと思います。
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
出力:
TWO
TWO
ONE
TWO
上記のコードでは、ChildClass に showTest() メソッドがないため、継承によって ParentClass showTest() メソッドが使用されます。結果を見ると、メソッドが ParentClass で実行されているため、TEST 定数の ParentClass バージョンが評価されているのに対し、継承によって ChildClass コンテキスト内で評価されているため、ChildClass メンバー変数 $test が評価されていることがわかります。
ドキュメントを読みましたが、このニュアンスについて何も言及されていないようです。どなたか教えていただけませんか?
ベストアンサー1
self::
継承を認識しておらず、常に実行されているクラスを参照します。php5.3 以降を使用している場合は、継承を認識しているので試してみるstatic::TEST
とよいでしょう。static::
違いは、static::
「遅延静的バインディング」を使用することです。詳細については、次を参照してください。
http://php.net/manual/en/language.oop5.late-static-bindings.php
以下は私が書いた簡単なテスト スクリプトです。
<?php
class One
{
const TEST = "test1";
function test() { echo static::TEST; }
}
class Two extends One
{
const TEST = "test2";
}
$c = new Two();
$c->test();
出力
test2