class A{
const FOO = 1;
}
class B extends A{
const FOO = 5;
function foo(){
print self::FOO;
print static::FOO;
}
}
$b = new B;
$b->foo();
どちらの場合も5を出力します。
では、定数で静的と自己を使用することに違いはありませんか?
後期静的バインディングのコンテキストでは、違いがあります。
このコードを考えてみましょう:
<?php
class A {
const FOO = 1;
function bar() {
print self::FOO;
print "\n";
print static::FOO;
}
}
class B extends A {
const FOO = 5;
}
$b = new B;
$b->bar(); // 1 5
このコードを実行すると、出力は次のようになります。
1
5
を参照するself::FOO
と、の値1
が出力されます(bar()
クラスB
で呼び出された場合でも、static
キーワードが使用された場合、遅延静的バインディングが有効になり、静的キーワードを使用した場合ではなく、FOO
から定数を参照しました。B
A
これは、PHP5.3以降に関連しています。
あなたの例では、違いを確認するのに十分ではありません。ただし、次の場合:
class Foo
{
protected static $FooBar = 'Foo';
public function FooBar()
{
echo "static::\$FooBar = " . static::$FooBar . PHP_EOL;
echo "self::\$FooBar = " . self::$FooBar . PHP_EOL;
}
}
class Bar extends Foo
{
protected static $FooBar = 'Bar';
}
$bar = new Bar();
$bar->FooBar();
違いがわかります(スコープと解決されているインスタンス[継承vs.ベース])
はい、違いがあります。サンプルコードでは、との両方が同じ宣言self
を参照しています。static
const FOO
ユーザー「drew010」によって送信された例は、違いを示しています。