【问题标题】:When printing strings into html page, PHP prints them on wrong places将字符串打印到 html 页面时,PHP 将它们打印在错误的位置
【发布时间】:2015-11-27 04:30:20
【问题描述】:

我的大师班具有打印网站各个部分的功能。我有一个打印主容器的函数,它是一个包含所有内容的 div。 (html/body/#master-container/(所有网站元素))。在该函数内部,我有抽象的受保护函数,用于网页(子类)以生成进入#master-container 的内容。这是大师班代码的一部分:

  ...
  # print content
  abstract protected function print_content();

  # print master-container
  public function print_master_container(){
    $output = '
      <div id="master-container">
        '.$this->print_content().'
      </div>
    ';
    echo $output;
  }
  ...

这是子类中的代码:

class Starting_page extends Core {
        public function print_content(){
            $this->print_navbar();
            echo 'test';
        }
    }
...

现在的问题是它会打印所有内容(字符串 'test' 和函数$this-&gt;print_navbar()&lt;div id="master-contaiener&gt;&lt;/div&gt; 之外打印的内容。如何修复此代码以实际打印其中的所有内容分区。 下面的屏幕截图显示了页面源内部问题的结果。红色光标显示应实际打印项目(以黄色突出显示)的位置。

如果需要显示更多代码,请说出来。

【问题讨论】:

  • print_content() 是回显输出还是返回它?
  • 它有回声。当我把回报放在它上面时,它运作良好。但是,当我将 return 放入受保护的函数 print_navbar() 时,它不会打印任何内容。 (从那个函数)
  • 正如@Tristan所说,您需要返回print_content()的内容
  • 导航栏的内容可能也会回显,所以在print_content() 中只需做一个输出缓冲区并在最后返回内容:ob_start();$this-&gt;print_navbar(); echo 'stuff'; $data = ob_get_contents(); ob_end_clean(); return $data;
  • 如果你把$this-&gt;print_navbar()改成return,那么在这个方法中你需要echo $this-&gt;print_navbar();所以:ob_start(); echo $this-&gt;print_navbar(); echo 'stuff'; $data = ob_get_contents(); ob_end_clean(); return $data;

标签: php oop


【解决方案1】:

正如 cmets 中的好人所说,问题在于特定方法使用 echo 而不是 return。但是,当使用return 时,根本就没有输出。然后@Rasclatt 也想出了解决方案;

class Starting_page extends Core {
    public function print_content(){
        # output buffering start
        ob_start();

        # print navbar
        $this->print_navbar();

        # declare output buffering content
        $output = ob_get_contents();

        # add more output data
        $output .= 'other content';

        # end output buffering and return it
        ob_end_clean();
        return $output;
    }
}

值得注意的是$this-&gt;print_navbar() 仍然使用echo 来打印输出。如果使用return,则调用此方法时应添加前缀echo

【讨论】:

    猜你喜欢
    • 2015-01-03
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多