我有硕士班和半硕士班。主类核心是一个打印所有头部、导航、页脚和元元素的类。基类打印与内容相关的数据,所有页面级别的类扩展它并在特定的div中打印它们的数据。
我的问题是函数和全局不在基类中的一个函数的范围内。我哪里做错了?
abstract class Core {
abstract protected function print_content();
}
abstract class Base extends Core {
abstract protected function print_page_content();
public function print_content(){
ob_start();
$this->get_nav();
$output = ob_get_contents();
$output .= ' ... '.$this->print_page_content().' ...';
ob_end_clean();
}
}
class Page extends Base {
private function get_games(){...}
private function process_form(){...}
public function print_page_content(){
$this->process_form(); # <--- function doesn't see it (!)
$output = '..... '.$this->get_games().' .... '; # <-- function DOES see this tho (!)
$GLOBALS['m_id']; # <-- or any other global such as $_GET, $_POST is not under scope.
return $output;
}
当我报告错误时,它不会打印任何错误。它只是忽略调用函数的行。
然而,当我强制出错时,就会出现错误。
让我们关注技术方面(而不是较小的故障或设计决策)。
我不认为您发布的代码片段包含错误。让我给你一个版本,它包含你向我们展示的所有内容,并且只添加与你的代码片段不“冲突”的内容,即你遗漏的最小实现(同样:纯粹的技术)。
<?php
abstract class Core {
abstract protected function print_content();
}
abstract class Base extends Core {
abstract protected function print_page_content();
public function print_content(){
ob_start();
$this->get_nav();
$output = ob_get_contents();
$output .= '###'.$this->print_page_content().'###';
ob_end_clean();
echo $output;
}
public function get_nav() {
echo '| Base::get_nav |';
}
}
class Page extends Base {
protected $names = array();
private function get_games(){ return htmlspecialchars(var_export($this->names, true)); }
private function process_form(){ $this->names['Jean']="D'Arc"; $this->names['John']='Malkovich';}
public function print_page_content(){
$this->process_form();
$output = '<pre>'.$this->get_games().'</pre>';
$output .= '<p>'.$GLOBALS['m_id'].'</p>';
return $output;
}
}
$m_id = 4711;
$p = new Page;
$p->print_content();
它打印
| Base::get_nav |###<pre>array (
'Jean' => 'D\'Arc',
'John' => 'Malkovich',
)</pre><p>4711</p>###
(请点击此处:https://3v4l.org/ZBQ0b )
那么,你的脚本和这个脚本有什么不同呢?为了测试目的,尽量减少脚本,以便找到原因。
编辑:您的sscce的建议改进
private function process_form(){
// $stmt = add your prepare()/statement here as a comment
$params = array(/* put in all the variables here, you would bind*/);
// <-- maybe the actual bind code here as comment -->
return var_export( $params, true );
}#endfunc(process_form)
public function print_page_content(){
$pf = $this->process_form();
$output = 'print_page_content stuff...'.$this->get_games()
.' <pre>'.$pf.'</pre>';
return $output;
}#endfunc(print_page_content)
抽象类被继承后,抽象方法不能被重写。