Có và không có parent::__construct(); trong class con kế thừa, php OOP
Phương thức constructor là phương thức được thực thi ngay sau khi ta thực hiện tạo một đối tượng. Tôi có thắc về câu lênh parent::construct(); trong phương thức khởi tạo của 1 class con sau:
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
nguồn: http://php.net/manual/en/language.oop5.decon.php Tại sao lại có parent::construct(); trong class con kế thừa, í nghĩa và sự khác biệt khi có và không có?
1 CÂU TRẢ LỜI
Từ khoá parent
sẽ giúp bạn gọi đến hàm của class cha, tức class mà class hiện tại của bạn kế thừa (trực tiếp hay gián tiếp).
Hàm parent::__construct()
sẽ giúp bạn gọi đến hàm __construct()
của class cha.
Như ở ví dụ của bạn thì
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
class AnotherSubClass extends BaseClass {
function __construct() {
print "In SubClass constructor\n";
}
}
$a = new BaseClass(); // In ra "In BaseClass constructor"
$b = new SubClass(); // In ra cả "In BaseClass constructor" và "In SubClass constructor"
$c = new AnotherSubClass(); // Chỉ in ra "In SubClass constructor"
Như bạn có thể thấy, nếu có hàm parent::__construct()
thì khi đối tượng được khởi tạo, nó sẽ gọi cả constructor của class cha, ngược lại thì không.
Như vậy tức là mình cần phải khởi tạo đối tượng cha trước? Và từ khóa parent trong php tương đồng với super trong java. Thank.
@luuxuandattmydbg Đơn giản là mình chỉ gọi đến construct từ class cha thôi ạ, không cần phải khởi tạo đối tượng cha trước.
Như vậy tức là mình cần phải khởi tạo đối tượng cha trước?
Không phải bạn ạ. Khi class cha bạn cũng có hàm __construct()
và bạn viết một class kế thừa từ nó, cũng viết lại hàm __construct()
(kỹ thuật overriding
) thì khi bạn khởi tạo đối tượng từ class con, sẽ chỉ có hàm __construct()
của class con được chạy (do nó đã viết đè lên hàm __construct()
của class cha).
Với việc sử dụng từ khoá parrent
bên trong hàm __construct()
của class con, bạn sẽ có thể gọi đến hàm __construct()
của class cha mà nó kế thừa.
Cám ơn câu trả trời dễ hiểu.