Saya ingin lebih memahami mengapa, dalam skenario di bawah ini, ada perbedaan dalam cara konstanta kelas diwarisi vs. variabel instan.
<?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();
Keluaran:
TWO
TWO
ONE
TWO
Dalam kode di atas, ChildClass tidak memiliki metode showTest (), jadi metode ParentClass showTest () digunakan oleh pewarisan. Hasilnya menunjukkan bahwa karena metode ini dijalankan pada ParentClass, versi ParentClass dari konstanta TEST sedang dievaluasi, sedangkan karena metode tersebut mengevaluasi dalam konteks ChildClass melalui pewarisan, variabel anggota ChildClass $ test sedang dievaluasi.
Saya telah membaca dokumentasinya, tetapi tidak melihat ada penyebutan nuansa ini. Adakah yang bisa memberi penjelasan untuk saya?
php
oop
inheritance
overriding
constants
Tom Auger
sumber
sumber
final
...Jawaban:
self::
Tidak sadar-warisan dan selalu mengacu pada kelas yang dijalankannya. Jika Anda menggunakan php5.3 +, Anda dapat mencobastatic::TEST
sepertistatic::
yang sadar-warisan.Perbedaannya adalah yang
static::
menggunakan "pengikatan statis terlambat". Temukan informasi lebih lanjut di sini:http://php.net/manual/en/language.oop5.late-static-bindings.php
Berikut skrip pengujian sederhana yang saya tulis:
keluaran
sumber
static::
.test()
ini bukan metode statis, mengapa tidak menggunakan$this::TEST
dengan PHP5.3 +?self::
/static::
perbedaan tetapi saya tidak mengerti mengapa menggunakanstatic::
alih-alih$this::
(tidakself::
). Apakah ada perbedaan antara$this::
danstatic::
(karena ada satu antarastatic::
/$this::
danself::
)?Dalam PHP, self mengacu pada kelas di mana metode atau properti yang disebut didefinisikan. Jadi dalam kasus Anda Anda menelepon
self
diChildClass
, sehingga menggunakan variabel dari kelas itu. Kemudian Anda gunakanself
inParentClass
, sehingga akan merujuk ke variabel di kelas itu.jika Anda masih ingin kelas anak untuk mengganti
const
kelas induk, maka sesuaikan kode berikut di kelas induk Anda untuk ini:Perhatikan
static
kata kuncinya. Ini menggunakan "pengikatan statis terlambat". Sekarang kelas orang tua Anda akan memanggil const dari kelas anak Anda.sumber