2011-09-19 33 views
12

Tôi cần một tầng lớp phụ huynh để truy cập các thuộc tính con của nó:Tiếp cận tài sản con từ phạm vi mẹ

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Khi $_fields được sửa đổi từ phạm vi nhỏ, nó vẫn còn null trong phạm vi phụ huynh. Khi cố gắng truy cập $ child_var từ phạm vi cha mẹ bằng cách sử dụng $this->child_var, tất nhiên là không xác định.

tôi không tìm thấy bất cứ điều gì giống như một "chức năng thiết lập" mà chỉ có thể được sao chép trong lớp trẻ ...

+4

Bạn có thể muốn làm cho tính chất 'protected' thay vì 'private'. –

Trả lời

9

Hãy xem một bài viết về visibility.

Về cơ bản, bạn không thể truy cập vào các thuộc tính/phương pháp của cha mẹ cũng như phụ huynh không thể truy cập vào con của nó. Tuy nhiên, bạn có thể khai báo thuộc tính/phương pháp của mình protected thay thế.

class Parent { 
    protected $_fields = null; 

    public function do_something() { 
     // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    protected $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
+0

Cảm ơn bạn! Đó là chính xác những gì tôi đang tìm kiếm. Dường như tôi không đọc đủ tài liệu đó. –

6

Cố gắng truy cập giá trị con từ lớp cơ sở (cha mẹ) là thiết kế kém. Điều gì xảy ra nếu trong tương lai một người nào đó sẽ tạo một lớp khác dựa trên lớp cha của bạn, hãy quên tạo thuộc tính cụ thể mà bạn đang cố gắng truy cập trong lớp cha của bạn?

Nếu bạn cần phải làm điều gì đó như thế bạn nên tạo tài sản trong một lớp học phụ huynh, và sau đó đặt nó trong con:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

Về cơ bản trong cha mẹ bạn không nên tham khảo nội dung trẻ em cụ thể, bởi vì bạn không thể chắc chắn nó sẽ ở đó!

Nếu bạn phải, bạn nên sử dụng trừu tượng:

PHP Abstraction

+0

Vâng, tôi biết đó là một thực tế tồi, nhưng một trường hợp rất cụ thể của nó thực sự đòi hỏi nó. Cảm ơn câu trả lời của bạn anyway. –

+0

Tôi hiểu vấn đề, nhưng giải pháp này vẫn đang tìm kiếm tôi một cách mạo hiểm. Làm thế nào chúng ta có thể thực thi lớp con để xác định một thuộc tính nào đó? Tôi có một hàm cụ thể trong lớp cha trừu tượng mà yêu cầu một thuộc tính nhất định. Ngay bây giờ tôi đang sử dụng $ this-> childProperty trong lớp cha và nó chạy nhưng cùng một vấn đề mà bạn đã đánh dấu. –

+0

Bạn có thể tạo tóm tắt '$ child_var'. điều này sẽ buộc bất kỳ trẻ em thực sự thực hiện nó. Các thuộc tính –

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