2012-06-07 34 views
5

Tôi đã tự hỏi tại sao chúng ta phải gọi một cách rõ ràng hàm tạo con trong PHP? Điều gì xảy ra nếu, giả sử, chúng ta quên gọi hàm khởi tạo cha trong lớp dẫn xuất? Tôi nghĩ rằng lớp dẫn xuất sẽ không có quyền truy cập vào các thuộc tính thành viên hoặc phương thức của lớp cha của nó nhưng sau khi tôi cố gắng không gọi hàm khởi tạo của cha, có vẻ như lớp con vẫn có quyền truy cập vào công khai/được bảo vệ của cha mẹ nó hội viên.Điều gì sẽ xảy ra nếu bạn không gọi hàm khởi tạo cha mẹ một cách rõ ràng trong PHP?

Vì vậy, chúng ta phải gọi một cách rõ ràng hàm tạo của nó? Hậu quả là gì nếu chúng ta quên làm như vậy?

Xin cảm ơn trước. Bất kỳ loại trợ giúp nào cũng sẽ được đánh giá cao :)

+2

xem lại http://php.net/manual/en/language.oop5.php thủ công của bạn – sephoy08

Trả lời

4

Tùy thuộc vào mã của bạn. Trong nó đơn giản nhất không có gì xảy ra nếu bạn không gọi constructor cha, nhưng nếu constructor cha của bạn làm một cái gì đó khởi tạo cho lớp cha, tất cả những gì còn lại. Hãy xem xét và chơi với điều này:

<?php 

class X { 
    private $_a; 

    public function __construct($a) { 
     echo 'X::construct '; 
     $this->_a = $a; 
    } 

    public function getA() { 
     return $this->_a; 
    } 
} 

class Y extends X { 
    private $_b; 

    public function __construct($a,$b) { 
     echo 'Y::construct '; 
     parent::__construct($a); 
     $this->_b = $b; 
    } 

    public function getAB() { 
     return $this->_b + $this->getA(); 
    } 
} 

$n = new Y(3,2); 
echo $n->getAB(); 

Thật dễ dàng để thấy rằng nếu bạn chạy nó, nó in ra 5 (trong số các bãi chứa khác). Nhưng nếu bạn nhận xét class Y gọi điện cho phụ huynh parent::__construct($a);, bạn nhận được 2. Đó là hậu quả trong trường hợp này.

1

Hậu quả thực sự phụ thuộc vào những gì xảy ra trong hàm khởi tạo gốc. Tất cả các thuộc tính và phương thức thành viên được bảo vệ và công khai đều có sẵn ngay cả khi hàm tạo của cha mẹ không được gọi, đó là chính xác. Nhưng các giá trị của các thành viên lớp kế thừa có thể được sửa đổi/khởi tạo trong hàm khởi tạo mẹ - bạn sẽ cần phải quyết định xem bạn có muốn điều đó xảy ra hay không.

Quyết định thường là tốt để luôn thêm cuộc gọi vào hàm tạo cha, ngay cả khi không có gì xảy ra ở đó (có thể thay đổi trong tương lai). Lý do duy nhất để bỏ qua cuộc gọi này là khi bạn cần ghi đè các hành động được thực hiện trong hàm tạo. Đó là một tính năng bổ sung thêm tính linh hoạt hơn bạn có, ví dụ: trong Java, nơi bắt buộc hàm tạo của cha là bắt buộc.

3

Vì trình xây dựng cha mẹ không được gọi ngầm nếu lớp con định nghĩa một hàm tạo. Nếu lớp con giả định rằng cha mẹ đã khởi tạo và thực hiện một số công việc, nó cần phải đảm bảo rằng hàm khởi tạo cha được nhập vào.

Ví dụ: bạn có thể mở rộng một lớp mà bạn không cần muốn nhập hàm khởi tạo gốc. Hành vi này chỉ cho phép thiết kế linh hoạt hơn. Trong hầu hết các trường hợp, bạn có thể là muốn gọi hàm khởi tạo gốc.

Tất cả phụ thuộc vào lý do tại sao bạn đã mở rộng cấp độ gốc. Bạn có cần phương pháp yêu cầu cha mẹ để khởi tạo? Nếu có, hãy gọi hàm tạo của nó. Bạn có thể chỉ cần tiêm một số phụ thuộc cụ thể cần thiết sau khi mở rộng nó, hoặc cần những thứ đơn giản như hằng số? Sau đó, bạn có thể không cần phải.

Các vấn đề liên quan