Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用输出缓冲时,3级类中的作用域很奇怪_Php_Scope - Fatal编程技术网

Php 使用输出缓冲时,3级类中的作用域很奇怪

Php 使用输出缓冲时,3级类中的作用域很奇怪,php,scope,Php,Scope,我有硕士班和半硕士班。主类核心是一个打印所有头部、导航、页脚和元元素的类。基类打印与内容相关的数据,所有页面级别的类扩展它并在特定的div中打印它们的数据 我的问题是函数和全局函数不在基类中某个函数的作用域内。我哪里出错了 abstract class Core { abstract protected function print_content(); } abstract class Base extends Core { abstract protected funct

我有硕士班和半硕士班。主类核心是一个打印所有头部、导航、页脚和元元素的类。基类打印与内容相关的数据,所有页面级别的类扩展它并在特定的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;
 }
抽象类核心{
抽象保护函数print_content();
}
抽象类基扩展了核心{
抽象保护函数print_page_content();
公共功能打印内容(){
ob_start();
$this->get_nav();
$output=ob_get_contents();
$output.='…'。$this->print_page_content();
ob_end_clean();
}
}
类页扩展了基{
私有函数get_games(){…}
私有函数进程\u form(){…}
公共功能打印页面内容(){

$this->process_form();#继承抽象类后,抽象方法无法重写。

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


您做了哪些尝试?是否有任何错误?添加错误报告(全部);在函数顶部,运行它,它会输出一个错误。它不会打印任何错误。它只会忽略调用函数的行。当我强制执行错误时,会出现错误。强制执行时,会出现什么错误?我假设是您自己定义的错误?a)ob_start();紧接着是ob_get_contents()-重点是什么?b)$output.=…$this->print\u page\u content()需要print\u page\u content()返回一些东西;你的代码snpipe并不表示它返回了。以前在父类中声明了抽象,那么你就不能继承父抽象函数。你能举一个简单的例子吗?我不明白你的意思。我花了一些时间从我的脚本中删除了所有内容。这里是这样的:非常好,非常努力;-)还有一件事:现在是凌晨4点re和我应该在床上躺了…年。现在,你的sscce的输出在我看来没有错。是吗?如果是的话:在哪里,什么?;-)在公共功能开始时打印页面内容$this->process\u form()调用,该函数应返回“test”字符串。但是,如果在$output变量内调用该函数,它会打印“test”字符串。输出中没有“test”。我也在这里:)哦,对了。您的process_form()函数返回了一些内容。我假设(在我的示例中)它只是处理和存储状态。好吧,在你的代码中,你对返回值不做任何处理;你调用了该方法,然后返回值就丢失了。你想让它去哪里/产生效果?还有另一个提示:你现在尝试将完全成熟的脚本压缩成一个sscce(从大到小).在您描述的情况下,做相反的事情可能会更有成效:从一个非常小的/基本的脚本开始,完成这一部分,然后一步一步地放入所有其他内容,直到它崩溃(从小到大)。例如,从一个类开始(不继承/实现任何内容),只使用
公共函数process\u form()
并以尽可能少的方式为其提供所需的任何东西,对其进行测试,然后再从那里着手。
<?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>###
  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)