2011-06-22 30 views
6

Tôi đang tìm kiếm một cách để gọi một constructor lớp cha tự động một cách kỳ diệu từ một lớp con (?):Làm thế nào để tự động chạy xây dựng trong lớp cha mẹ mà không gọi từ lớp con

(Lưu ý: Đây chỉ là một ví dụ, vì vậy các lỗi đánh máy có thể có mặt)

Class myParent() 
{ 
    protected $html; 

    function __construct($args) 
    { 
     $this->html = $this->set_html($args); 
    } 

    protected function set_html($args) 
    { 
     if ($args['foo'] === 'bar') 
      $args['foo'] = 'foobar'; 
     return $args; 
    } 
} 

Class myChild extends myParent 
{ 
    public function do_stuff($args) 
    { 
     return $this->html; 
    } 
} 

Class myInit 
{ 
    public function __construct($args) 
    { 
     $this->get_stuff($args); 
    } 

    public function get_stuff($args) 
    { 
     $my_child = new myChild(); 
     print_r($my_child->do_stuff($args)); 
    } 
} 

$args = array('foo' => 'bar, 'what' => 'ever'); 
new myInit($args); 

// Should Output: 
/* Array('foo' => 'foobar', 'what' => 'ever') */ 

Những gì tôi muốn tránh được phải gọi điện (bên trong lớp myChild) __construct($args) { parent::__construct($args); }.

Câu hỏi: Điều này có khả thi không? Nếu vậy: Làm thế nào?

Cảm ơn!

+0

Tại sao bạn phản đối việc gọi 'parent :: __ construct()'? – cspray

+1

Tôi cũng muốn PHP viết ứng dụng của mình một cách kỳ diệu. –

+0

@Wesley van Opdorp Vui lòng xem giải pháp. Làm việc cho tôi. @Charles Sprayberry Tôi có một lớp cơ sở được mở rộng bởi một số lớp không xác định và do đó tôi phải chạy một thủ tục tiêu chuẩn cho tất cả các đối số đầu vào (như thả đầu vào không hợp lệ, mặc định phân tích, v.v.) – kaiser

Trả lời

9

Trong mã mẫu của bạn, myParent :: __ construct sẽ được gọi là wen instanciating myChild. Để có được mã của bạn để làm việc như bạn muốn chỉ cần thay đổi

public function get_stuff($args) 
{ 
    $my_child = new myChild(); 
    print_r($my_child->do_stuff($args)); 
} 

bởi

public function get_stuff($args) 
    { 
     $my_child = new myChild($args); 
     print_r($my_child->do_stuff()); 
    } 

Chừng nào myChild không có constructor, các nhà xây dựng phụ huynh sẽ được gọi là/thừa hưởng.

+0

Hoàn hảo. +1. Tôi đã không biết rằng tôi có thể thả nó vào lớp và constructor cha được gọi. Cảm ơn – kaiser

+1

vui lòng trợ giúp;) – malko

+0

'Miễn là myChild không có hàm tạo, hàm tạo cha sẽ được gọi/thừa kế.' Cảm ơn bạn rất nhiều! Tôi đã tìm kiếm rất nhiều để tìm thấy tuyên bố đơn giản này mô tả hoàn hảo những gì đang xảy ra! – Sliq

5

Như Child không có constructor hiện tại và mở rộng Parent, bất cứ lúc nào new Child() được quy định các nhà xây dựng Parent sẽ ngầm gọi.

Nếu bạn chỉ định một hàm dựng Child thì bạn phải sử dụng chỉ định parent::__construct(); bên trong hàm tạo Child vì nó sẽ không được gọi ngầm.

N.B Khi xác định một constructor trong một lớp con đó là thực hành tốt nhất để gọi parent::__construct() trên dòng đầu tiên của định nghĩa phương pháp để cho bất kỳ thông số ví dụ và tình trạng di truyền được thiết lập trước khi phân lớp bắt đầu.

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