self
menunjuk ke kelas di mana itu ditulis.
Jadi, jika metode getInstance Anda ada dalam nama kelas MyClass
, baris berikut:
self::$_instance = new self();
Akan melakukan hal yang sama seperti:
self::$_instance = new MyClass();
Edit: beberapa informasi lagi, setelah komentar.
Jika Anda memiliki dua kelas yang saling memperluas, Anda memiliki dua situasi:
getInstance
didefinisikan di kelas anak
getInstance
didefinisikan di kelas induk
Situasi pertama akan terlihat seperti ini (saya telah menghapus semua kode yang tidak diperlukan, untuk contoh ini - Anda harus menambahkannya kembali untuk mendapatkan perilaku tunggal) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Di sini, Anda akan mendapatkan:
object(MyChildClass)#1 (0) { }
Yang artinya self
berarti MyChildClass
- yaitu kelas di mana itu ditulis.
Untuk situasi kedua, kodenya akan terlihat seperti ini:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Dan Anda akan mendapatkan hasil seperti ini:
object(MyParentClass)#1 (0) { }
Yang berarti self
berarti MyParentClass
- yaitu sini juga, kelas di mana ada tertulis .
Dengan PHP <5.3, "kelas tempat ia ditulis" itu penting - dan terkadang dapat menyebabkan masalah.
Itulah mengapa PHP 5.3 memperkenalkan penggunaan baru untuk static
kata kunci: sekarang dapat digunakan tepat di tempat yang kita gunakan self
dalam contoh tersebut:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Namun, dengan static
alih - alih self
, Anda sekarang akan mendapatkan:
object(MyChildClass)#1 (0) { }
Yang berarti static
poin semacam itu ke kelas yang digunakan (yang kami gunakan MyChildClass::getInstance()
), dan bukan yang tertulis.
Tentu saja, perilaku self
belum diubah, untuk tidak merusak aplikasi yang ada - PHP 5.3 baru saja menambahkan perilaku baru, mendaur ulang static
kata kunci.
Dan, berbicara tentang PHP 5.3, Anda mungkin ingin melihat halaman Binding Statis Akhir dari manual PHP.