2013-07-23 53 views
14

Khi được kế thừa từ một lớp cha mẹ trong PHP, đặc biệt là trong Codeigniter, những gì hiện parent::__construct or parent::model() làm gì?PHP Codeigniter - parent :: __ construct

Làm cách nào để tạo sự khác biệt nếu tôi không __construct lớp cha mẹ? Và, cách nào được đề xuất?

-Added-

Trọng tâm là thêm về CodeIgniter cụ thể liên quan đến một cuộc gọi đến parent::__construct theo những cách khác nhau tùy thuộc vào phiên bản và cũng nếu điều này có thể được bỏ qua trong trường hợp CodeIgniter sẽ làm việc này tự động.

+3

tìm hiểu về 'hàm tạo'. –

+0

parent :: __ construct() constructor SubClass [Doc] (http://php.net/manual/fr/language.oop5.decon.php) – Bora

+0

tốt, tôi biết những gì các nhà xây dựng làm. Họ là một trong những phương pháp ma thuật sẽ tự động chạy khi lớp được khởi xướng nhưng điều tôi hỏi là sự khác biệt sẽ xảy ra nếu tôi không khai báo điều này vì kết quả dường như không khác biệt nhiều lắm với Codeigniter. –

Trả lời

60

Đây là một hàm tạo lớp bình thường. Hãy xem xét ví dụ sau:

class A { 
    protected $some_var; 

    function __construct() { 
     $this->some_var = 'value added in class A'; 
    } 

    function echo_some_var() { 
     echo $this->some_var; 
    } 
} 

class B extends A { 
    function __construct() { 
     $this->some_var = 'value added in class B'; 
    } 
} 

$a = new A; 
$a->echo_some_var(); // will print out 'value added in class A' 
$b = new B; 
$b->echo_some_var(); // will print out 'value added in class B' 

Như bạn thấy, lớp B thừa hưởng tất cả các giá trị và chức năng từ A. Vì vậy, các thành viên lớp $some_var có thể truy cập từ A cũng như từ B. Bởi vì chúng tôi đã thêm một constructor trong lớp B, các nhà xây dựng của lớp A sẽ KHÔNG được sử dụng khi bạn đang tạo một đối tượng mới của lớp B.

Bây giờ nhìn vào các ví dụ sau:

class C extends A { 
    // empty 
} 
$c = new C; 
$c->echo_some_var(); // will print out 'value added in class A' 

Như bạn có thể thấy, bởi vì chúng tôi có không khai báo một hàm tạo, hàm tạo của c lass A được sử dụng ngầm. Nhưng chúng ta cũng có thể làm như sau, đó là tương đương với lớp C:

class D extends A { 
    function __construct() { 
     parent::__construct(); 
    } 
} 
$d = new D; 
$d->echo_some_var(); // will print out 'value added in class A' 

Vì vậy, bạn chỉ cần sử dụng dòng parent::__construct(); khi bạn muốn có một constructor trong lớp con làm điều gì đó, và thực hiện constructor mẹ. Ví dụ đưa ra:

thông tin
class E extends A { 
    private $some_other_var; 

    function __construct() { 
     // first do something important 
     $this->some_other_var = 'some other value'; 

     // then execute the parent constructor anyway 
     parent::__construct(); 
    } 
} 

thêm có thể được tìm thấy ở đây: http://php.net/manual/en/language.oop5.php

+2

@webber .. Rất tiếc, bạn đã từ chối chỉnh sửa của mình. Nó thực sự là chính xác, vì vậy tôi đã đẩy nó qua. Bắt tốt trên lỗi 'private' – arserbin3

0

gì parent :: __ xây dựng hoặc cha mẹ :: mô hình() làm gì?

các chức năng này thực hiện chính xác như nhau, chỉ có chức năng xây dựng được sử dụng để đặt tên sau chính lớp trước PHP5. Tôi nói trong ví dụ của bạn, bạn đang mở rộng lớp Model (và trên một số phiên bản cũ hơn của CI vì bạn không cần sử dụng CI_model), nếu tôi đúng trong __construct này giống như model().

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