提问者:小点点

使用输出缓冲时,第三级类中的怪异范围


我有硕士班和半硕士班。主类核心是一个打印所有头部、导航、页脚和元元素的类。基类打印与内容相关的数据,所有页面级别的类扩展它并在特定的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;
 }

当我报告错误时,它不会打印任何错误。它只是忽略调用函数的行。

然而,当我强制出错时,就会出现错误。


共2个答案

匿名用户

让我们关注技术方面(而不是较小的故障或设计决策)。
我不认为您发布的代码片段包含错误。让我给你一个版本,它包含你向我们展示的所有内容,并且只添加与你的代码片段不“冲突”的内容,即你遗漏的最小实现(同样:纯粹的技术)。

<?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' =&gt; 'D\'Arc',
  'John' =&gt; '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)

匿名用户

抽象类被继承后,抽象方法不能被重写。