2012-07-29 43 views
7

在类函数中使用html有什么问题吗?我在DOM中调用它,所以我不需要返回一个字符串。在php类中使用html不好吗?

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; 
} 

UPDATE

我应该解释为什么我这样做。我正在制作一个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的核心

+0

PHP需要更多的工作,保持它的类的更快速地显示HTML .. – 2012-07-29 05:59:55

+0

查找到[ZF](HTTP://框架。 zend.com/)如果你想了解如何分离你的观点,模型和控制器。 – Sam152 2012-07-29 06:13:47

+0

不幸的是,这是一个Wordpress插件,我在工作中使用Zend,但是 – JackMahoney 2012-07-29 06:16:58

回答

4

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

$content = <<<EOD 
content here 
EOD; 

EOD可以是任何东西,但要注意两点:

  1. 它不能有任何空格在它面前,它必须是在它自己的行
  2. 它不应该是可以在你的内容中

如果你正在使用PHP> = 5.3,那么你应该使用NOWDOC,不变量解析里面做中找到字符串c(除非你需要这个)。与NOWDOC的语法,唯一不同的是,前哨用引号括起来:

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

为什么我会从输出缓冲流浪远的原因是,它阻止服务器分块发送到客户端的数据。这意味着请求看起来会比较慢,因为不是将内容逐步发送到客户端并显示,而是强制一次发送所有内容。输出缓冲是一种破解情况,当功能粗心地echo数据而不是返回它或某些特定需求的应用程序的工具。如果您使用输出缓冲(因为它涉及函数调用)而不是将字符串插入到变量或包含视图中,我还会想象如果您使用输出缓冲,那么您会对执行时间产生影响。

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

这就是说,WordPress的模板和代码看起来很松散,如果根本不实现MVC,则松散地实现MVC,因此如果为此创建视图的工作太多,我会说sloppiness会适合WP的风格。

+0

好的,使用输出缓冲的缺点是什么? – JackMahoney 2012-07-29 06:03:02

+0

@JackMahoney更新以说明OB的缺点。 – 2012-07-29 06:10:38

+0

感谢您的意见。我同意WordPress的可以得到混乱。我需要返回一个字符串,所以我猜heredoc可能是最好的解决方案。其他人提到从控制器分离视图,但这将需要使用output_buffering,因为我必须返回一个字符串 – JackMahoney 2012-07-29 06:19:02

2

我认为这是很好的做法,使用PHP只为应用程序的逻辑并传输一些数据到查看图层(模板引擎)。按照这个,有一些模式像MVC。

4

关于通过在PHP类文件中放置实际为“视图”的前端开发人员疏远这一事实,这不是一个好习惯。当我第一次开始使用PHP时,这是我最大的问题之一,是我想在类中动态创建内容。这是一个好主意,但你希望这样做的方式可以让团队中的许多成员尽可能顺利地一起工作;]。

你或许应该有一个名为“工作人员成员的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; 
} 
+0

已更新的问题,以显示该应用程序,感谢您的帮助到目前为止,虽然 – JackMahoney 2012-07-29 06:14:11

+0

我编辑我的答案,实际显示'get_single()'函数返回一个字符串。我的代码中缺少return语句,但它仍然适合您的示例,因为当您使用require时,视图文件仍然可以访问所有类的变量,就好像它仍然在类中。 – Anther 2012-07-29 06:20:09

+0

谢谢,我喜欢这个解决方案。我也很感谢你在团队中的工作,因为我是白天的前端开发人员 – JackMahoney 2012-07-29 06:22:33