2012-05-11 67 views
1

下面是一個抽象類和派生類的示例。在類A中有一個抽象方法,「collectData」,它在類B中實現。當調用方法「getData」時,調用「collectData」,並在私有成員變量「$ data」中設置值。之後,getData返回這個變量的內容。如果你運行這個,你會希望返回值是數組(1,2,3)。但它是一個空陣列。爲什麼?順便說一句,我使用PHP 5.3.10。當抽象方法返回時,PHP成員數據丟失

<?php 

abstract class A 
{ 
    private $data; 

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

    abstract protected function collectData(); 

    public function getData() 
    { 
     $this->collectData(); 
     return $this->data; 
    } 
} 

class B extends A 
{ 
    protected function collectData() 
    { 
     $this->data = array(1, 2, 3); 
    } 
} 

$test = new B(); 
$data = $test->getData(); 
print_r($data); 

回答

5

它不應該是:

private $data; 

但:

protected $data; 

私有財產不推導後可見。

+0

該死,這樣一個簡單的監督。謝謝。 – colordrops

1

充分利用$data財產publicprotected,你會看到...

如果財產是私有的,print_r沒有看到它...或者撥打var_dump($data) - 這應該打印出來也是私有成員.. 。

0

將一個setter和一個getter在抽象類來管理數據屬性

public function setData($data){ 
    $this->data = $data; 
} 

public function getData($data){ 
    return $this->data; 
}