2013-06-01 143 views
2

我對OOP PHP相當陌生,在構建我的第一個項目時,我遇到了一些困難的難題。我應該創建一個對象還是使用數組?

我在試圖建立一個論壇。是的,我知道那裏有很多免費的東西,我只想根據自己的需要建立一個:)。另外,編碼很有趣。

我已經爲論壇,帖子和帖子構建了基本模型和控制器和模板。 基礎模型具有標準的數據庫功能,如查找所有,按ID查找等。各個模型擴展了模型類,並且只對該類具有特定的功能。 我已經設置它是這樣的:

不僅如此。很艱苦,我已經不得不做出對某些函數和變量是靜態或沒有決定。我有這樣的困境:

基本的增刪改查工作從基本模型。這很好,我可以通過從(基本)模型中調用靜態方法來創建,更新,刪除和讀取數據庫,這些方法實例化這些論壇,線程和發佈模型的對象。到現在爲止還挺好。在Model Class

部分:

<?php 
     /** 
    * Find rows from database based on sql statement 
    * @param string $sql 
    * @retun array $result_set 
    */ 
    static public function find_by_sql($sql = '') { 
     $db = Database::getInstance(); 
     $mysqli = $db->getConnection(); 
     $result = $mysqli->query($sql); 
     $object_array = array(); 
     while ($record = $result->fetch_array()) { 
      $object_array[] = static::instantiate($record); 
     } 
     return $object_array; 
    } 

    private static function instantiate($record) { 
     $object = new static; 
     foreach ($record as $attribute => $value) { 
      if ($object->has_attritube($attribute)) { 
       $object->$attribute = $value; 
      } 
     } 
     return $object; 
    } 
} 
?> 

我轉移這些對象在我的模板顯示。從一張桌子上看書時,效果很好。

<?php 
$postcount = $pagination->offset + 1; 
if (!empty($posts)) { 
    foreach ($posts as $post) { 
     ?> 

     <div class="post"> 
      <div class="posttime"><?php echo strftime("%A %e %B %G %H:%M", $post->date_line); ?></div> 
      <div class="postnumber">#<?php echo $postcount; ?></div> 
      <div class="postuser"> 
       <div class="username"><?php echo $post->username; ?></div> 
       <div class="avatar">avatar</div> 
      </div> 
      <div class="postcontents"> 
       <div class="posttext"><?php echo $post->pagetext; ?></div> 
      </div> 
     </div> 

     <?php 
     $postcount++; 
    } 
    ?>  
<div class="pagination"><?php echo $page_split; ?></div> 

但是,爲了顯示線程中的所有帖子,我需要來自用戶表的信息,例如,有多項自己的職位,等級,分身等

好了,所以這裏的東西:

SELECT * FROM post 
LEFT JOIN user ON (post.user_id = user.id) 
where thread_id={$id} 
ORDER BY date_line DESC 
LIMIT {$offset} , {limit} 

我現在有更多的領域那時,我已經安裝在我的崗位模型變量。所以他們不會被轉移顯示。

我應該使用數組來顯示這些額外的字段而不是對象嗎?我寧願仍然使用對象方法進行顯示,因爲我現在正在爲此進行設置。

或者我應該將這些用戶字段作爲變量添加到Post模型中?我認爲這並不是最簡單的方法,但它會起作用。

或者我應該通過foreach循環來獲取(尚未創建)用戶類的單獨實例嗎?我認爲這會耗盡更多的內存,然後左連接,只是得到我需要的數據。

我想就如何解決這個問題提供一些提示。

+1

靜態變量不是面向對象的範例的一部分。模型是一個圖層,而不是數據庫表的抽象。這也使「後期模型」變得毫無意義。 –

+0

感謝您的評論。我試圖自己學習,所以我依賴於我在一些在線課程中學到的知識。我正試圖將我在這些事情上學到的東西結合起來。可能我沒有得到最好的信息。那麼你怎麼設置呢? – LvS

回答

1

由於您在Post實體中混合來自不同實體的屬性,您將無法使用您的模式解決此問題[即用戶名]。

的想法是,你就必須讓你的代碼意識到實體之間的關係,如:

class Post extends Entity 
{ 

    protected $id; 
    protected $body; 
    protected $date; 

    // this will be an instance of a Thread entity, let's say 
    protected $thread; 

    // this will be an instance of the User entity 
    protected $user; 

    ... 

} 

這樣,您就能夠做到:

$somePost -> getUser() -> getAvatar(); 

但你如何爲每個帖子注入正確的用戶和線程?這就是Object Relational Mappers的用途:在你的情況下,所有的SQL東西都會被ORM處理,你只需要處理你的對象圖,而不用擔心自己構建查詢;你只需要定義這種關係。

一個流行的PHP ORM是Doctrinehere is an example about how it handles relationships declarations

當然這種方法有缺點,但這取決於您是否正在研究並找出靈活性和依賴關係之間的最佳平衡點。

+0

謝謝!就在我認爲我越來越接近的時候......我發現我在這裏有很多東西要學習......我會對此進行肯定的調查。至少讓我進入另一種思維模式,謝謝。 – LvS

+0

那麼我在這裏理解主要的「想法」嗎?控制器從模型中獲取信息並將其傳遞給視圖。模型告訴我這個Mapper,我需要從數據庫獲得這個信息...去爲我找它? – LvS

2

有一件事可能會打破困境;在PHP中,對象也可以是act as an array(或even a function!),但普通的普通數組不能具有屬性或任何其他OOP功能。

+0

也許我不應該實例化Post_Model類的對象,而是用我需要的所有字段硬編碼這個標準對象的創建。 – LvS

+0

我不得不說...自己很難學習...我想學習如何做到最好,每個人都有不同的看法。我所能做的就是谷歌的基本意見......但什麼是建立這個系統的實際正確方法......這對我來說是一個令人頭疼的問題。 – LvS

相關問題