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 selfberarti 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 selfberarti 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 statickata kunci: sekarang dapat digunakan tepat di tempat yang kita gunakan selfdalam contoh tersebut:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Namun, dengan staticalih - alih self, Anda sekarang akan mendapatkan:
object(MyChildClass)#1 (0) { }
Yang berarti staticpoin semacam itu ke kelas yang digunakan (yang kami gunakan MyChildClass::getInstance()), dan bukan yang tertulis.
Tentu saja, perilaku selfbelum diubah, untuk tidak merusak aplikasi yang ada - PHP 5.3 baru saja menambahkan perilaku baru, mendaur ulang statickata kunci.
Dan, berbicara tentang PHP 5.3, Anda mungkin ingin melihat halaman Binding Statis Akhir dari manual PHP.