2011-03-21 56 views
4

所以我對PHP,MySQL和Javascript還是有些新鮮但我一直在做一個項目,所以我一直在快速學習。不過,我覺得在我的PHP頁面中混合了太多的HTML和PHP。起初,我認爲這是標準的做法,但有人告訴我,你不應該混合這兩者,我開始看我的代碼。我覺得自己在表達邏輯和我的模型邏輯混合得太多了。一些幫助?

例如,加載提交的頁面時,我有一個循環,看起來像這樣(精簡版):

<?php 
while ($row = mysql_fetch_assoc($submissionQuery)) 
{ 
    $submissionID = $row['id']; 
?> 
    <div class="submission" id="submission<?php echo $submissionID; ?>"> 
    <h3><?php echo $row['title']; ?></h3> 
    </div> 
<?php } ?> 

爲什麼我不只是包圍整個區塊PHP中的原因是因爲這裏不僅有h3,而且我也不想使用大量回聲。

在我看來這看起來很糟糕,我想知道更好的方法。我想我可以將所有的提交內容存儲到一個數組中,然後在後面循環,但是我看到幾個缺點:

1)不必要地將值存儲到數組中。只有在之後立即召回他們。

2)如果有很多提交內容可能沒有足夠的內存來存儲它們。

3)需要更多的代碼。

4)仍然要遍歷數組後來在那種情況下,我還是混合PHP和HTML(只是程度較輕)

我不知道。我只是需要一些建議,以便最好地處理這個問題,因爲我不想以錯誤的方式來做事情,然後在事件中斷或變得太複雜時不得不重新構造所有事情。

+2

您可能會發現[控制結構的替代語法](http://php.net/manual/en/control-structures.alternative-syntax.php)有幫助。 – 2011-03-21 16:29:39

回答

4

使用PHP時,幾乎不可能混用PHP和HTML。但這並不意味着你將表示邏輯與業務邏輯混合在一起。這是兩件非常不同的事情。

在你的例子中你正在混合你的代碼。一個更好的方法來做到這一點將是。

你有一個文件,將其稱爲submission_proccess.php,在那個文件中你會有這個代碼。

$submission = array(); 
while ($row = mysql_fetch_assoc($submissionQuery)) { 
    $submission[] = $row; 
} 

//more logic 
//include your view submission_view.php 

現在submission_view.php是你view,可以這麼說。在那裏,你就會有這樣的事情

<?php foreach ($submissions as $submission) : ?> 
    <div class="submission" id="submission<?php echo $submission['id']; ?>"> 
    <h3><?php echo $submission['title']; ?></h3> 
    </div> 
    <?php endforeach; ?> 

這裏最重要的是看你會不會碰你的視圖文件,如果說你想修改您的查詢或也許過濾。您的業​​務邏輯與您展示它的方式保持分離。你甚至可以刪除HTML包含,只需要一個文件,該文件取$submission變量並將其輸出爲JSON。

你應該看有些東西是

  • PHP框架 - Zend的,CakePHP的,CodeIgnitor,交響樂,Kohona等等。他們幫助您分離這些部分
  • 另一件事是PHP alternate syntax for control structures
  • 此外,PHP模板系統像Smarty。有些人可能會爭辯說,使用Smarty只是增加了另一個不必要的層,但當你不想去完整的框架堆棧時它非常有用。
+0

用於提及框架,還用於爲全面的框架路線提供輕量級替代方案。 – 2011-03-21 17:07:33

0

我真的不喜歡我的視圖模板中的任何服務器端代碼 - 我更喜歡只擁有佔位符。然而,大多數框架在視圖中都包含循環和回顯變量。

看看模板系統,比如smarty(我討厭smarty BTW),但他們至少會給你機會分開這種東西,這總是一件好事。

+0

Smarty只是增加了一個額外的smarty-functions圖層......其實和php的功能完全一樣......用不同的語法...... IMO,它是一個熵圖層。 – acm 2011-03-21 16:39:59

0

在不同的抽象層中分離邏輯並不排除也不阻止混合PHP和HTML或其他代碼。關鍵是要實現適當的問題分離和正確的混合程度。

在表示邏輯層中,您將使用HTML,CSS,一些Javascript和一些(可能很少)PHP進行編碼。這就是PHP的工作方式。但是,你可以保持這個代碼簡單,只是部件的膠水。

在業務邏輯層中,您將使用PHP進行編碼,也可能使用一些SQL或一些JavaScript。

爲了緩解問題的分離,我通常會將不同源文件中的圖層分開。 構建時,構建腳本適當地將代碼混合到實際的最終構件和渲染。

最後,你不需要自己重新創造一切。看看PHP的一些應用程序框架和模板引擎。有些可能有直接的幫助;或者至少,你會得到一些想法和設計策略來建立你的基礎。