2011-08-18 137 views
1

我嘗試從它類似於下面的概念擴展孩子訪問父母的財產訪問父母的財產,OOP:問題從擴展子

class Base 
{ 
    protected static $me; 
    protected static $var_parent_1; 
    protected static $var_parent_2; 

    public function __construct ($var_parent_1 = null) 
    { 
     $this->var_parent_1 = $var_parent_1; 
     $this->me = 'the base'; 
    } 

    public function who() { 
     echo $this->me; 
    } 

    public function parent_1() { 
     echo $this->var_parent_1; 
    } 
} 

class Child extends Base 
{ 
    protected static $me; 
    protected static $var_child_1; 
    protected static $var_child_2; 

    public function __construct ($var_child_1 = null) 
    { 
     parent::__construct(); 
     $this->var_child_1 = $var_child_1; 
     $this->me = 'the child extends '.parent::$me; 
    } 

    // until PHP 5.3, will need to redeclare this 
    public function who() { 
     echo $this->me; 
    } 

    public function child_1() { 
     echo $this->var_child_1; 
    } 
} 

$objA = new Base($var_parent_1 = 'parent var 1'); 
$objA->parent_1(); // "parent var 1" 
$objA->who(); // "the base" 

$objB = new Child($var_child_1 = 'child var 1'); 
$objB->child_1(); // "child var 1" 
$objB->who(); // should get "the child extends the base" 

但我得到「孩子伸出」的代替「孩子繼承基礎」如果我使用$this->

如果我改變似乎OK所有$this->self::

爲什麼?

是唯一正確的方式來訪問父母的屬性,這是改變所有$this->self::

編輯:

我刪除了所有static關鍵字,

class Base 
{ 
    protected $me; 
    protected $var_parent_1; 
    protected $var_parent_2; 

    public function __construct ($var_parent_1 = null) 
    { 
     $this->var_parent_1 = $var_parent_1; 
     $this->me = 'the base'; 
    } 

    public function who() { 
     echo $this->me; 
    } 

    public function parent_1() { 
     echo $this->var_parent_1; 
    } 
} 

class Child extends Base 
{ 
    protected $me; 
    protected $var_child_1; 
    protected $var_child_2; 

    public function __construct ($var_child_1 = null) 
    { 
     parent::__construct(); 
     $this->var_child_1 = $var_child_1; 
     $this->me = 'the child extends '.parent::$me; 
    } 

    // until PHP 5.3, will need to redeclare this 
    public function who() { 
     echo $this->me; 
    } 

    public function child_1() { 
     echo $this->var_child_1; 
    } 
} 

$objA = new Base($var_parent_1 = 'parent var 1'); 
//$objA->parent_1(); // "parent var 1" 
//$objA->who(); // "the base" 

$objB = new Child($var_child_1 = 'child var 1'); 
$objB->child_1(); // "child var 1" 
$objB->who(); // "the child extends the base" 

然後我得到這個錯誤Fatal error: Access to undeclared static property: Base::$me in C:\wamp\www\test\2011\php\inheritence.php on line 109是指這條線,

$this->me = 'the child extends '.parent::$me; 
+0

您確定要將這些設置爲「靜態」嗎? – jtbandes

+0

不確定...我實際上覆制並修改了這個http://stackoverflow.com/questions/831555/php-child-class-accessing-parent-variable-problem – laukok

回答

0

靜態屬性的屬性類,而不是你用它們創建的對象。一個靜態屬性被該類的所有對象共享,並且使用self訪問::

如果你刪除靜態它應該按照你想要的方式工作,並且你會像現在一樣使用$ this->。

+0

的答案示例謝謝。是的,刪除了所有的靜態關鍵字,但然後我得到一個錯誤。請參閱我上面的編輯。謝謝。 – laukok

+0

所以你現在已經讓我成爲一個非靜態的,它應該是。但是詢問哪個對象是你的對象的父對象是沒有意義的?你的對象有一個父類,而不是父對象。這就是你所看到的新錯誤的原因。記住靜態是指類,實例變量是指對象。 – Jonah

0

請請參考此answer來解釋使用self和this之間的區別。

1

(簡化的答案,我不知道如何解釋這個,不寫20頁,對不起)。

在執行時,您的基類和子類會合併到一個對象中。在這種情況下,你的實例變量也會被合併。所以,你不能調用parent :: $ avar,你可以調用$ this-> var(因爲所有變量都成爲當前實例的元素)

方法的行爲完全不同:因爲子類是應該是基類的專業化,寫在基類中的代碼不一定需要完全重寫:您可以調用它並執行其他操作,而不必重寫子類中的原始代碼。