在一个PHP类中使用HTML是不好的吗?

7
在类函数中使用HTML有什么问题吗?我在DOM中调用它,所以不需要返回字符串。
public function the_contact_table(){
    ?>
    <div>
        some html here
    </div>
    <?php
}

当我需要这个字符串时,我是否可以使用这种方法?还有更好的方法吗,或者这是相对标准的方法吗?

public function get_single(){
    ob_start();?>
        <div class='staff-member single'>
            <div class='col left'>
                <div class='thumbnail'>
                    thumbnail
                </div>
                <?php $this->the_contact_table(); ?>
            </div>
            <div class='col right'>

            </div>
        </div>      
    <?php
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}

更新

我应该解释一下为什么要这样做。我正在制作一个WordPress插件,想要控制文章类型的输出。因此,我使用了以下类似的过滤器。

public function filter_single($content){
     global $post;
     if ($post->post_type == 'staff-member') {

         $sm = new JM_Staff_Member($post);
         $content = $sm->get_single();
     }
     return $content;
}

所以,正如您所看到的,我必须将一个字符串返回给WordPress核心。

PHP需要更多的工作,将其从类中排除可以更快地呈现HTML。 - Mr. Alien
如果你想学习如何分离视图、模型和控制器,请查看ZF - Sam Becker
不幸的是,这是一个 Wordpress 插件,而我在工作中使用 Zend。 - JackMahoney
3个回答

4

如果你想要将一个长字符串存储到变量中,那么你应该使用HEREDOC而不是输出缓冲。它的格式如下:

$content = <<<EOD
content here
EOD;

EOD 可以是任何内容,但需要注意以下两点:

  1. 它前面不能有任何空格,并且必须在自己的一行上
  2. 它不应该是在您的内容中可以找到的字符串

如果您使用的是 PHP >= 5.3,则应该使用 NOWDOC,它不会解析文档内的变量(除非您需要此功能)。NOWDOC 的语法与 HEREDOC 相同,只是分界符用引号括起来:

$content = <<<'EOD'
content here
EOD;

我不建议使用输出缓冲的原因是它会阻止服务器将数据分块发送给客户端。这意味着请求看起来会更慢,因为内容不会逐步发送到客户端并显示,而是被迫一次性发送。输出缓冲是一种针对函数粗心地使用echo而不是返回数据或具有特定需要的某些应用程序的hack。如果使用输出缓冲(因为它涉及函数调用)而不是将字符串HEREDOC到变量中或包含视图,则执行时间可能会受到影响。
现在回答关于是否适当的问题,我认为在MVC应用程序中,所有HTML和其他内容都应该包含在自己的视图中。然后控制器可以调用视图来显示自己,而不必担心知道涉及显示视图的代码。您仍然可以传递信息(例如标题、作者、标签数组等)到视图,但这里的目标是将内容与逻辑分离。
话虽如此,WordPress模板和代码看起来相当松散,如果为此创建视图太麻烦,那么我认为这种松散性将符合WP的风格。

使用输出缓冲的缺点是什么? - JackMahoney
@JackMahoney 更新以说明 OB 的缺点。 - Bailey Parker
谢谢建议。我同意WordPress可能会变得混乱。我需要将它返回为字符串,所以我想heredoc可能是最好的解决方案。其他人提到了将视图与控制器分离,但这需要使用output_buffering,因为我必须返回一个字符串。 - JackMahoney
我更新了我的回答,我忘记展示这个函数实际上返回一个字符串。 - Anther
@Anther 你不需要评论我的答案来引起Jack Mahoney的注意。由于他已经评论了你的答案,如果你在你的答案上发表评论,他将会收到通知。 - Bailey Parker
显示剩余2条评论

4
这种把实际上是“视图”的内容放在PHP类文件中的做法不好,因为会让前端开发人员感到疏远。当我第一次开始使用PHP时,这是我最大的问题之一,因为我想在类中动态创建内容。这是个好主意,但你需要以一种让团队成员能够尽可能顺畅地协作的方式来实现它。你应该把内容放在一个名为“staff-member-single.php”的单独文件中,然后在函数中调用它。
public function get_single(){
    ob_start();
    require_once('views/staff-member-single.php');
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}

你通常会将其重构为可重用的方法,因此它会看起来有点像...
public function get_single()
{
    $string = $this->render_view_as_string('satff-member-single');
    return $string;
}

public function render_view($view)
{
    require('views/'.$view.'.php');
}

public function render_view_as_string($view)
{
    ob_start();
    $this->render_view($view);
    $content = ob_get_contents();
    ob_end_clean();
    return $content;
}

已更新问题并显示应用程序,感谢您迄今为止的帮助。 - JackMahoney
我编辑了我的回答,实际上展示了get_single()函数返回一个字符串的情况。我的代码中缺少了return语句,但它仍然适用于你的例子,因为当你使用require时,视图文件仍然可以访问类的所有变量,就好像仍然在类内部一样。 - Anther
谢谢,我很喜欢这个解决方案。我也很感激你提到了团队合作的重要性,因为我白天是一名前端开发人员。 - JackMahoney

2

我认为只使用PHP处理应用程序的逻辑和将一些数据传输到视图层(模板引擎)是一个好的实践。根据这个原则,有一些模式,比如MVC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接