2010-06-20 42 views
28

Tôi đã tự hỏi liệu có thể gọi cho cha mẹ __construct(), trước __construct() của con với thừa kế trong PHP hay không.Gọi hàm tạo cha mẹ trước hàm tạo con trong PHP

Ví dụ:

class Tag { 
    __construct() { 
     // Called first. 
    } 
} 

class Form extends Tag { 
    __construct() { 
     // Called second. 
    } 
} 

new Form(); 

Lý tưởng nhất, tôi sẽ có thể làm điều gì đó ở giữa chúng. Nếu điều này là không thể, có cách nào khác, điều này có cho phép tôi làm điều này không?

Lý do tôi muốn làm điều này là có thể tải một loạt các cài đặt mặc định cụ thể cho Thẻ mà Biểu mẫu có thể sử dụng khi __construct() được gọi.

CHỈNH SỬA: Xin lỗi quên để thêm điều này .. Tôi không muốn gọi lớp cha mẹ từ lớp con. Nó chỉ đơn giản bởi vì nó cho thấy một số dữ liệu cá nhân (đối với công ty mẹ) cho đứa trẻ, khi bạn vượt qua nó như là một cuộc tranh cãi

Đây là những gì tôi muốn làm:

$tag = new Tag($privateInfo, $publicInfo); 
$tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance. 

Tag.php

class Tag { 
    private $privateInfo; 
    public $publicInfo; 
    __construct($private, $public) { 
     $this->privateInfo = $private; 
     $this->publicInfo = $public; 
    } 
} 

form.php

class Form extends Tag { 

    __construct() { 
     echo $this->publicInfo; 
    } 
} 

Có ý nghĩa?

Cảm ơn! Matt Mueller

+0

Bạn có thể giải thích rõ hơn về điều này không? –

+2

Dữ liệu cá nhân của một lớp cha sẽ không được hiển thị với bất kỳ lớp con nào. Dữ liệu công cộng hoặc được bảo vệ sẽ không riêng tư. –

+0

Yah, nhưng nếu tham số (riêng) đi qua hàm tạo con đầu tiên, thì con có quyền truy cập vào chúng. Tôi đã chỉnh sửa nó để làm rõ. – Matt

Trả lời

46

Chỉ cần gọi parent :: __ xây dựng ở trẻ em.

class Form extends Tag 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     // Called second. 
    } 
} 
+1

Ahh xin lỗi. Tôi quên thêm rằng tôi không muốn có nó trong constructor của đứa trẻ. Vui lòng đọc chỉnh sửa. – Matt

+0

Quyết định rằng đây là lựa chọn thay thế tốt nhất. Thật không may, nó không chính xác những gì tôi muốn - oh well .. Cảm ơn! – Matt

+0

Ồ wow Denis, bạn đã thực sự giúp đỡ tôi trong vài ngày qua .. Cảm ơn người đàn ông! – Matt

3

vâng chỉ cần gọi parent::__construct() trong cấu trúc của bạn

+0

Ahh xin lỗi tôi quên bao gồm một yêu cầu ... Vui lòng đọc bản chỉnh sửa để cập nhật. – Matt

+2

Đây là cách để làm, chỉ cần đọc hướng dẫn sử dụng OOP nếu bạn không đồng ý. Đừng cố gắng phát minh lại bánh xe. Nếu bạn có mối quan ngại về mô hình của bạn, hãy thử đăng bài đó, để xem bạn đã làm như thế nào. Có lẽ bạn đang làm một kỹ thuật thiết kế xấu. – Pentium10

+0

Tôi không cố gắng phát minh lại bánh xe ... Tôi đang cố gắng giải quyết các yêu cầu của mình. – Matt

3

Có, nhưng chỉ trong nội bộ (ví dụ, bằng cách viết một phần mở rộng PHP), vì vậy nếu tôi là bạn tôi muốn giải quyết với gọi parent::__construct(). Xem this section trên wiki PHP.

Xin lỗi, PHP không phải là Java. Tôi nghĩ rằng không yêu cầu (ngầm hoặc explictly) các nhà xây dựng siêu được gọi là một quyết định thiết kế rất nghèo.

1

Từ âm thanh của nó, bạn có thể muốn suy nghĩ lại về thiết kế của mình để bạn không cần truyền các tham số trong hàm tạo. Nếu bạn không nghĩ rằng nó có thể được thực hiện, hãy hỏi nó như một câu hỏi, bạn có thể ngạc nhiên bởi một số gợi ý.

Lớp con có khả năng ghi đè lên hàm tạo gốc mà không cần gọi nó. Tôi khuyên bạn nên có một phương thức cuối cùng trong lớp cha. Bằng cách đó, mọi người đều biết bạn không muốn điều này bị quá tải, và bất kỳ lớp kế thừa nào (đúng) đều có quyền truy cập để làm bất cứ điều gì nó muốn trong constructor.

class Father { 
    private $_privateData; 
    final function setPrivateData($privateData) { 
     $this->_privateData = $privateData; 
    } 
} 

khác, không được khuyến khích, nhiều hơn "reinventing the wheel", giải pháp sẽ được định nghĩa một hàm trong lớp cha mẹ, nói _construct(), đó được gọi là trong cấu trúc riêng của mình. Nó không thực sự rõ ràng, không sử dụng các tính năng/cấu trúc ngôn ngữ và rất cụ thể cho một ứng dụng đơn lẻ.

Điều cuối cùng cần ghi nhớ: bạn không thể ẩn thông tin khỏi lớp con.Với Reflection, serialize, var_dump, var_export và tất cả các API tiện lợi khác trong ngôn ngữ php, nếu có mã không nên làm bất cứ điều gì với dữ liệu, thì không có nhiều bạn có thể làm các phần tử không lưu trữ nó. Có những thư viện và như vậy giúp tạo ra các hộp cát, nhưng nó khó để sandbox một đối tượng từ chính nó.

Chỉnh sửa: Bằng cách nào đó tôi đã bỏ lỡ câu trả lời của Artefacto và tôi cho rằng anh ấy đúng (tôi chưa bao giờ thử viết phần mở rộng để làm điều đó). Tuy nhiên, việc triển khai nó phá vỡ các kỳ vọng của nhà phát triển trong khi làm cho khó hơn để xem mã giải thích những gì đang diễn ra.

+0

Xin chào, cảm ơn phản hồi của bạn. Thật không may chủ đề này có một chút ra khỏi tay, đó là lỗi của tôi. Dù sao, tôi đang cố gắng thiết kế lại nó. Tôi có một câu hỏi về câu trả lời của bạn ... làm thế nào bạn có thể làm điều này - "Các lớp con có khả năng ghi đè lên các nhà xây dựng cha mẹ mà không cần gọi nó cả."? – Matt

+0

@Matt Bạn không thể sử dụng mã PHP. Người viết lớp dẫn xuất có khả năng không gọi hàm tạo của cha mẹ chút nào. Những gì bạn có thể làm cho một dự án là có một hàm khác được định nghĩa mà được gọi bởi lớp cha trong hàm tạo của nó, nói _construct() mà cha mẹ định nghĩa và gọi. – Reece45

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