2011-06-23 9 views
28
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    } 
} 

$test = new B($some); 
$test->childfunction(); 

Câu hỏi: Làm cách nào để hiển thị biến phụ huynh ở trẻ? kết quả dự kiến ​​sẽ echo 'bb mẹ'PHP Truy cập Biến Cấp độ Gốc của Phụ huynh

Trả lời

50
echo $this->bb; 

Biến được kế thừa và không tin, vì vậy nó là một phần của đối tượng hiện hành.


Dưới đây là thông tin bổ sung để đáp ứng với yêu cầu của bạn để biết thêm thông tin về việc sử dụng parent:::

Sử dụng parent:: khi bạn muốn bổ sung thêm chức năng đến một phương pháp từ lớp cha mẹ. Ví dụ: hãy tưởng tượng một lớp học Airplane:

class Airplane { 
    private $pilot; 

    public function __construct($pilot) { 
     $this->pilot = $pilot; 
    } 
} 

Bây giờ giả sử chúng tôi muốn tạo một loại Máy bay mới có trình điều hướng. Bạn có thể mở rộng phương thức __construct() để thêm các chức năng mới, nhưng vẫn tận dụng các chức năng được cung cấp bởi phụ huynh:

class Bomber extends Airplane { 
    private $navigator; 

    public function __construct($pilot, $navigator) { 
     $this->navigator = $navigator; 

     parent::__construct($pilot); // Assigns $pilot to $this->pilot 
    } 
} 

Bằng cách này, bạn có thể làm theo các DRY principle phát triển nhưng vẫn cung cấp tất cả các chức năng bạn mong muốn.

+0

vì vậy điều đó có nghĩa là từ khóa ** mẹ ** chỉ được sử dụng để truy cập vào phương thức gốc? – Kuntau

+1

Thông thường, bạn sẽ sử dụng parent :: khi bạn muốn ghi đè lên một phương thức cha mẹ, nhưng vẫn tham chiếu đến chức năng của cha mẹ. Nếu bạn chỉ muốn gọi phương thức của cha mẹ, bạn làm theo cách tương tự như đối với biến: '$ this-> parentmethod()' –

1

$ bb hiện đã trở thành thành viên riêng tư của lớp B sau khi mở rộng lớp A, nơi lớp học được bảo vệ.

Vì vậy, bạn truy cập $ bb như nó là một thuộc tính của lớp B.

class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo $this->bb; 
    } 
} 

$test = new B($some); 
$test->childfunction(); 
+0

cái nào đúng $ this -> $ bb hoặc $ this-> bb? – Kuntau

+0

@kuntau, lỗi đánh máy. $ this-> bb; đúng. Tôi sửa nó rồi. – FinalForm

4

Chỉ cần echo nó kể từ khi nó được thừa hưởng

echo $this->bb; 
0

tất cả các thuộc tính và phương thức của lớp cha được thừa hưởng trong lớp con như vậy về mặt lý thuyết bạn có thể truy cập chúng trong lớp con nhưng hãy cẩn thận bằng cách sử dụng từ khóa protected trong lớp của bạn vì nó ném một lỗi nghiêm trọng khi được sử dụng trong lớp con.
như đã đề cập trong php.net

Các tầm nhìn của một tài sản hoặc phương pháp thể được định nghĩa bằng cách đặt trước khai báo với các từ khóa công cộng, protected hoặc private. Các thành viên trong nhóm tuyên bố công khai có thể được truy cập ở mọi nơi. Các thành viên được tuyên bố bảo vệ chỉ có thể truy cập trong các lớp học chính nó và bằng cách thừa kế và cha mẹ lớp học. Các thành viên được khai báo là riêng tư chỉ có thể được truy cập bởi lớp học mà xác định thành viên.

+0

'protected' không ném lỗi khi được sử dụng trong các lớp thừa kế và cha mẹ. – T30

3

Với parent::$bb; bạn cố gắng truy xuất hằng số tĩnh được xác định với giá trị $bb.

Thay vào đó, làm:

echo $this->bb; 

Lưu ý: bạn không cần phải gọi parent::_construct nếu B là lớp duy nhất mà gọi nó. Đơn giản là không khai báo __construct trong lớp B.

5
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$this->bb; //works by M 
    } 
} 

$test = new B($some); 
$test->childfunction();` 
+3

'parent :: $ this-> bb' đã trở thành cú pháp hướng đối tượng điên rồ nhất mà tôi từng thấy – Tobia

+0

' parent :: 'trong' parent :: $ this-> bb' không có gì ngoài việc gây nhầm lẫn cho người hỏi . Tôi khuyên bạn nên loại bỏ hoặc giải thích thêm để giảm độ phức tạp của câu trả lời. – SEoF