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 核心返回一个字符串

4

3 回答 3

4

如果要将长字符串存储到变量中,则应该使用HEREDOC而不是输出缓冲。它看起来像这样:

$content = <<<EOD
content here
EOD;

EOD可以是任何东西,但请注意两件重要的事情:

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

如果您使用的是 PHP >= 5.3,那么您应该使用 NOWDOC,它不会解析文档中的变量(除非您需要它)。与 NOWDOC 语法的唯一不同是标记用引号括起来:

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

我偏离输出缓冲的原因是它可以防止服务器将发送到客户端的数据分块。这意味着请求看起来会更慢,因为不是将内容逐步发送到客户端并显示,而是强制一次发送所有内容。输出缓冲是一种技巧,适用于粗心echo地处理数据而不是返回数据的情况,或者是特定应用程序的工具。我还想,如果您使用输出缓冲(因为它涉及函数调用)而不是使用 HEREDOC 将字符串转换为变量或包含视图,那么执行时间会受到影响。

现在要回答它是否合适的问题,我想说在 MVC 应用程序中,所有 HTML 和其他内容都应该包含在它自己的视图中。然后控制器可以调用视图来显示自己,而不必担心知道显示视图所涉及的代码。您仍然可以将信息(如标题、作者、标签数组等)传递给视图,但这里的目标是将内容与逻辑分开。

也就是说,Wordpress 模板和代码一开始看起来很草率,如果根本没有实现 MVC,那么如果要为此创建视图工作量太大,我会说这种草率符合 WP 的风格。

于 2012-07-29T06:02:21.127 回答
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;
}
于 2012-07-29T06:06:17.280 回答
2

我认为仅将 PHP 用于应用程序逻辑并将一些数据传输到视图层(模板引擎)是一种很好的做法。根据这一点,有一些像MVC这样的模式。

于 2012-07-29T06:01:52.873 回答