我对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
循环来获取(尚未创建)用户类的单独实例吗?我认为这会耗尽更多的内存,然后左连接,只是得到我需要的数据。
我想就如何解决这个问题提供一些提示。
静态变量不是面向对象的范例的一部分。模型是一个图层,而不是数据库表的抽象。这也使“后期模型”变得毫无意义。 –
感谢您的评论。我试图自己学习,所以我依赖于我在一些在线课程中学到的知识。我正试图将我在这些事情上学到的东西结合起来。可能我没有得到最好的信息。那么你怎么设置呢? – LvS