2012-07-29 45 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