Aturan praktis sederhana:jika kelas extends
lain, maka kelas itu adalah kelas induk itu (hanya sedikit diubah atau diperpanjang). Anda dapat melewati kelas anak ini alih-alih kelas induk. Contoh:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
Ini berfungsi, baz()
mengharapkan Foo
tetapi juga menerima Bar
, karena Bar
adalah sebuah Foo
.
Sekarang, adalah Users
. Anda sebuah Database
? Tidak. Pengguna Anda bukan database. Pengguna Anda menggunakan sebuah database. Jika ada, Anda harus menggunakan komposisi :
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
Sebuah kelas harus menjadi apa tanggung jawabnya apa . Tanggung jawab kelas manajemen pengguna adalah mengelola data pengguna. Bagian dari itu mungkin melibatkan berbicara dengan database, tetapi itu tidak berarti kelas manajemen pengguna adalah sebuah database. Jika User extends Database
, itu berarti ia dapat melakukan segalanya Database
kelas dapat melakukan (dan banyak lagi). Itu berarti Anda dapat menggunakan User
kelas di mana saja bukan Database
kelas, dan itu tidak masuk akal. Pisahkan tanggung jawab.
Sekarang, masih bisa diperdebatkan apakah itu struktur yang benar atau tidak, tetapi menuju ke arah yang benar. Tetapi Anda mungkin benar-benar ingin memiliki Users
kelas, yang mewakili satu pengguna . Anda kemudian memiliki UserManager
atau UserORM
atau UserStorage
atau apa pun, yang berkaitan dengan mengambil dan menyimpan User
objek dalam database. Kelas ini pada gilirannya menggunakan sebuah Database
untuk melakukan hal itu. Itu membuat tanggung jawab tetap jelas dan terpisah. Users
kelas mewakili data pengguna, Database
kelas berinteraksi dengan database, UserORM/Manager/whatever
di tengah negosiasi antara keduanya.