Yêu cầu thg 12 20, 2017 3:27 SA 5832 0 1
  • 5832 0 1
0

Có và không có parent::__construct(); trong class con kế thừa, php OOP

Chia sẻ
  • 5832 0 1

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


Đã trả lời thg 12 20, 2017 3:37 SA
Đã được chấp nhận
+5

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.

Chia sẻ
Avatar Đơngiantớtên Đạt @luuxuandattmydbg
thg 12 20, 2017 3:46 SA

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.

Avatar Le Xuan Duy @telosma
thg 12 20, 2017 3:54 SA

@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.

Avatar Tran Duc Thang @thangtd90
thg 12 20, 2017 3:57 SA

@luuxuandattmydbg

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.

thg 11 3, 2018 5:17 SA

Cám ơn câu trả trời dễ hiểu.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí