回答:
同じ結果が得られますか?
あんまり。ただし、PHP 5.2の回避策はわかりません。
違いは何である
new self
とはnew static
?
self
new
キーワードが実際に記述されているのと同じクラスを指します。
static
、PHP 5.3の新しい静的バインディングでは、メソッドを呼び出した階層内のクラスを指します。
次の例では、はB
両方のメソッドをから継承しA
ます。self
呼び出しがバインドされているA
それはで定義されているためA
のに対し、第1の方法の実装static
と呼ばれるクラスにバインドされている(も参照get_called_class()
)。
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
get_called_class()
。いつでも行うことができます。これはと実質的に同じですが__CLASS__
、LSB互換です。
self
それ自体を返し、static
オーバーライドできないものを返します...しかし、見た目は逆です。PHPの命名、規則、全体的なスタイルに感心するのを止めることはありません。-_-
このコードのメソッドが静的でない場合は、を使用して5.2で回避策を得ることができますget_class($this)
。
class A {
public function create1() {
$class = get_class($this);
return new $class();
}
public function create2() {
return new static();
}
}
class B extends A {
}
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
結果:
string(1) "B"
string(1) "B"
clone
、プロパティを再作成して設定するだけです。$copy = new static(); $copy->set($this->get()); return $copy;
self::
やはstatic::
その静的メソッドの基本クラスのサブクラスかのバージョンが使用されているかどうかに影響を与えるために起こっています。そのような状況が本質的に悪い習慣を示していると考える何らかの理由がない場合(そして、これがそうあるべき理由は何も見当たらない)、との選択はself::
、static::
非静的メソッド内と同じくらい適切です。静的メソッド。私はあなたのコメントを誤解しましたか、それとも私たちが単に間違っているのですか?
他の回答に加えて:
static ::はランタイム情報を使用して計算されます。
つまりstatic::
、プロパティの値が次の理由により、クラスのプロパティでは使用できません。
コンパイル時に評価できなければならず、実行時の情報に依存してはなりません。
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
使用する self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
@Grapestainがコメントで言及されているように、オブジェクトがインスタンス化される前の早い段階でエラーが発生したことは、私が作成したコードの致命的なエラーコメントには示されていません。
public $name = static::class;
例に示されているように、エラーは7 行目ではなく2行目にスローされることに注意してください。「static :: classはコンパイル時のクラス名解決に使用できません」というエラーは、PHPクラスのコンパイル時に$ nameフィールドにアクセスしようとしたところではなく、はるか以前に問題があることを示しています。最初の例では、7行目(または6行目)には到達しません。