apakah saya akan mendapatkan hasil yang sama?
Tidak juga. Saya tidak tahu solusi untuk PHP 5.2.
Apa perbedaan antara new self
dan new static
?
self
merujuk ke kelas yang sama dengan new
kata kunci yang sebenarnya ditulis.
static
, dalam binding statis akhir PHP 5.3, merujuk ke kelas apa pun dalam hierarki yang Anda panggil metode ini.
Dalam contoh berikut, B
mewarisi kedua metode dari A
. The self
Doa terikat untuk A
karena itu didefinisikan dalam A
pelaksanaan 's dari metode pertama, sedangkan static
terikat untuk yang disebut kelas (lihat juga 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()
, yang secara efektif sama dengan__CLASS__
, tetapi kompatibel dengan LSB.self
akan kembali dengan sendirinya, danstatic
akan mengembalikan sesuatu yang tidak dapat ditimpa ... Tapi lihatlah sebaliknya. Saya tidak pernah berhenti terkesan dengan penamaan, konvensi, dan gaya PHP. -_-Jika metode kode ini tidak statis, Anda bisa mendapatkan penyelesaian di 5.2 dengan menggunakan
get_class($this)
.Hasil:
sumber
clone
, tetapi hanya dengan membuat ulang dan mengatur properti.$copy = new static(); $copy->set($this->get()); return $copy;
self::
ataustatic::
akan mempengaruhi apakah versi kelas dasar atau versi subclass dari metode statis yang digunakan. Dengan tidak adanya alasan untuk berpikir bahwa situasi seperti itu terjadi secara inheren mengindikasikan praktik buruk (dan saya tidak melihat alasan mengapa ini harus terjadi), pilihan antaraself::
danstatic::
sama relevan dalam metode non-statis seperti di metode statis. Apakah saya salah memahami komentar Anda, atau salah kami saja?Selain jawaban orang lain:
Itu berarti Anda tidak dapat menggunakan
static::
properti kelas karena nilai properti:Menggunakan
self::
sumber
public $name = static::class;
, bukan pada baris 7, seperti yang disarankan oleh contoh. Kesalahan mengatakan: "static :: class tidak dapat digunakan untuk resolusi nama kelas waktu kompilasi" yang menunjukkan masalahnya bukan di mana Anda mencoba mengakses bidang $ name, tetapi jauh sebelumnya, pada kompilasi kelas PHP. Jalur 7 (atau 6) tidak akan tercapai dalam contoh pertama.