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