Asked Dec 20th, 2017 3:27 AM 1461 0 1
  • 1461 0 1
0

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

Share
  • 1461 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 ANSWERS


Answered Dec 20th, 2017 3:37 AM
Accepted
+2

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.

Share
Đơngiantớtên Đạt @luuxuandattmydbg
Dec 20th, 2017 3:46 AM

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.

0
| Reply
Share
Le Xuan Duy @telosma
Dec 20th, 2017 3:54 AM

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

0
| Reply
Share
Thang Tran Duc @thangtd90
Dec 20th, 2017 3:57 AM

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

0
| Reply
Share
Đặng Thái Sơn @dangson242
Nov 3rd, 2018 5:17 AM

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

0
| Reply
Share