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()方法也可以工作。
結果是'title Acolumn Adata Aformat Aformat B'和2個有關未定義變量的通知 – zerkms
我必須同意zerkms:輸出正確顯示所有方法。 – NeXuS