2012-11-02 69 views
1

我有下面的類層次結構:PHP繼承的方法沒有運行

interface IReportGenerator { 

    public function setTitle ($title); 

    public function setColumns ($columns); 

    public function setPrintArea ($start, $stop); 

    public function setPageOrientation ($value); 

    public function createReport ($data); 

    public function saveReport ($name, $path = null); 

    public function saveReportAs ($name, $path = null, $type = null); 
} 

abstract class AbstractReportGenerator implements IReportGenerator { 
    public function __construct() { 
     $this->report = new PHPExcel(); 
    } 

    public function setTitle ($title, $now = false) { 
     // store 

     return $this; 
    } 

    public function setColumns ($columns) { 
     // store 

     return $this; 
    } 


    public function setPaperSize ($value, $now = false) { 
     // store 

     return $this; 
    } 

    public function setPageOrientation ($value, $now = false) { 
     // store 

     return $this; 
    } 

    public function setPrintArea ($start, $stop, $now = false) { 
     // store 

     return $this; 
    } 

    public function saveReport ($name, $path = NULL) { 
     return $this->saveReportAs($name,$path,self::EXCEL_2007); 
    } 

    public function saveReportAs ($name, $path = NULL, $type = NULL) { 
     // save report 

     return $this; 
    } 

    public function createReport ($data) { 
     $this->doHeader(); 

     $this->doTitle(); 

     $this->doColumnHeaders(); 

     $this->doData($data); 

     $this->doFooter(); 

     $this->doFormatting(); 

     $this->doMargins(); 

     $this->doPrintOptions(); 
    } 

    abstract protected function doHeader(); 

    abstract protected function doTitle(); 

    abstract protected function doColumnHeaders(); 

    abstract protected function doData($data); 

    abstract protected function doFooter(); 

    abstract protected function doFormatting(); 

    abstract protected function doMargins(); 

    abstract protected function doPrintOptions(); 
} 

class ReportGeneratorSimple extends AbstractReportGenerator { 
    public function __construct() { 
     parent::__construct(); 
    } 

    protected function doHeader() { 
     // do nothing 
    } 

    protected function doTitle() { 
     echo 'title A'; 
    } 

    protected function doColumnHeaders() { 
     echo 'column A'; 
    } 

    protected function doData ($data) { 
     echo 'data A'; 
    } 

    protected function doFooter() { 
     // do nothing 
    } 

    protected function doFormatting() { 
     echo 'format A'; 
    } 

    protected function doMargins() { 
     // do nothing 
    } 

    protected function doPrintOptions() { 
     // do nothing 
    } 
} 

class ReportGeneratorFormatted extends ReportGeneratorSimple { 
    public function __construct() { 
     parent::__construct(); 
    } 

    protected function doHeader() { 
     parent::doHeader(); 
    } 

    protected function doFooter() { 
     parent::doFooter(); 
    } 

    protected function doFormatting() { 
     parent::doFormatting(); 

     echo 'format B'; 
    } 
} 

當我這樣做:

$report = new ReportGeneratorFormatted(); 
$report->setTitle('title'); 
$report->setColumns($columns); 
$report->createReport($data); 
$report->saveReport('file.xlsx'); 

輸出我得到的是(排名不分先後):

'data A' 
'format A' 

任何想法爲什麼'標題A','列A'和'格式B'不打印? saveReport()和saveReportAs()方法也可以工作。

+0

結果是'title Acolumn Adata Aformat Aformat B'和2個有關未定義變量的通知 – zerkms

+0

我必須同意zerkms:輸出正確顯示所有方法。 – NeXuS

回答

0

@zerkins - 您是對的,我提供的代碼按預期運行。我提供的結果來自生產代碼,而不是樣品。

鑑於樣本正常工作,它就像追蹤生產代碼中的差異一樣簡單。原來,這是在其中一個子類中缺少對「父母」的呼叫。

謝謝!