2013-06-01 102 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

相关问题