2012-05-31 183 views
5

所以我想解決我在設計PHP類時遇到的問題。我創建了一個基類,並分配了私有變量。我有擴展這個基類的子類,它通過基類的功能引用和改變這些私有變量。下面是一個例子,記住我仍然感到困惑privateprotected方法之間的區別/變量(讓我知道如果我做錯了!):PHP從兒童私人變量訪問

base.class.php

<?php 
class Base { 
    private $test; 
    public function __construct(){ 
     require('sub.class.php'); 
     $sub = new Sub; 
     echo($this->getTest()); 
    } 
    public function getTest(){ 
     return $this->test; 
    } 
    protected function setTest($value){ 
     $this->test = $value; 
    } 
} 
?> 

sub.class.php

<?php 
class Sub extends Base { 
    public function __construct(){ 
     parent::setTest('hello!'); 
    } 
} 
?> 

所以我希望得到的結果是hello!印在屏幕上 - 而不是沒有什麼。對我來說,可能存在對課程的基本誤解,或者我只是在做錯事。任何指導非常感謝!謝謝。

編輯:

謝謝大家誰貢獻一個答案 - 我認爲,儘管優秀的解決方案,該子類實際上是不是我所需要的 - 這似乎委託類可能是在這一點上更加有用,因爲我並不需要從其他類中引用Base函數。

+1

嘗試回聲($子> getTest()); – bumperbox

+1

試試[PHP5 OOP](http://www.php.net/oop5)。 – meze

+1

沒有任何'echo'或'print'輸出屏幕上的內容 – zerkms

回答

8

應該是這樣的:

base.class.php:

class Base { 
    private $test; 
    public function __construct() { 
     echo $this->getTest(); 
    } 
    public function getTest() { 
     return $this->test; 
    } 
    protected function setTest($value) { 
     $this->test = $value; 
    } 
} 

sub.class.php:

class Sub extends Base { 
    public function __construct() { 
     parent::setTest('hello!'); // Or, $this->setTest('hello!'); 
     parent::__construct(); 
    } 
} 

主要代碼:

require 'base.class.php'; 
require 'sub.class.php'; 

$sub = new Sub; // Will print: hello! 
+2

我也會用'$ this->' – zerkms

+0

替換'parent ::'好吧,我可以看到爲什麼這個工作原理與我的想法相反。有沒有什麼辦法可以從子函數中引用父類的setTest函數,以便代碼'$ this-> test = $ value'爲父類設置變量,而不是子類?如果我可以從孩子的構造函數中創建它,我最終不需要打電話。我基本上想要訪問父函數,而不是繼承它們。 – iLoch

+0

@iLoch我不太明白你的意思,但看看我編輯的代碼。這是你想要的嗎? – flowfree