在PHP MVC上初始化对象 - 在视图之前或期间

时间:2015-10-14 17:32:50

标签: php oop object model-view-controller view

我正在构建一个简单的MVC框架,并坚持我如何设置对象。

TL; DR :最好在视图之前或视图渲染过程中初始化对象吗?

示例:

CONTROLLER

<?php
class Controller {
    public function __construct() {
        $user = new User();
    }
}
?>

对象用户

<?php
class User {
    public function __construct() {
       $this->setFriends($arg);
    }
    public function setFriends($arg) {}
    public function getFriends() {}
}
?>

对象友情

<?php
class Friend {
    .. properties ..
    .. methods() ..
}
?>

查看

<?php
foreach($user->getFriends() as $friend){
    .. $friend is a Friend Object already ..
    .. html...
}
?>

问题:最好在setFriends方法上初始化Friend对象(在加载视图之前 - 记住,有很多朋友)或getFriends方法(在加载视图上)?

public function setFriends($arg) {
    foreach($arg as $item)
        $this->friends[] = new Friend($item)
}

public function getFriends() {
    $tmp = array();
    foreach($this->friends as &friend)
        $tmp[] = new Friend($friend)
    return $tmp;
}

我认为在第一种情况下,内存将被预先消耗。第二种情况,仅当视图调用getFriends时,Friend Object才会初始化。

1 个答案:

答案 0 :(得分:1)

作为一般经验法则:

在初始化的早期(通常在boostrap层或类似物中)应该普遍要求使每个页面加载所需的任何内容。这包括基本控制器(其他人扩展),基本视图(此处相同),数据库处理程序对象等。

任何特定于一个页面的内容,正如您似乎与用户和朋友描述的那样,应该加载到控制器或控制器操作中,该操作处理加载该页面。这有助于保持代码集中和内存占用。

在这些情况下,最好尽可能多地从业务逻辑中移出视图,并将PHP保存在视图中,以用于简单的事情,如循环和回声。在MVC框架中,您经常会看到在控制器中构建的数组,因此可以将已经完成的大量数据传递给视图。例如,在您的控制器中,您可以实例化您的用户以作为参数传递给视图,然后实例化您的朋友并将它们全部添加到您作为另一个参数传递的朋友数组中。或者将这两个数组合并为一个大数组,并将单个'parameters'参数传递给视图。这将是您的所有视图可以共享的标准参数,然后在视图本身内分离数据数组。

其他选项变得更加可行,具体取决于您需要提供哪些有关朋友的信息。例如,在实例化用户时,您也可以(在构造函数中)实例化他们的每个朋友,分配给一个数组,并将它们全部保存为该用户的属性。这确实是一个笨重的对象,你必须考虑你是否使用了大量用户这将花费多少。

但是,你可以在某些情况下只需要朋友,所以在你需要它们时可以更有意义地实例化它们,而不是在你不需要的时候总是拥有它们。如果是这种情况,您的用户至少应该查找其朋友,并且能够在其自身内设置一个属性,该属性将包含查找朋友所需的信息。这意味着它是否包含在您的用户构造函数中(如果您总是需要知道用户拥有什么样的朋友),或者在像getFriends这样的单独函数中(如果您有时只需要了解用户的朋友),那么您将会需要至少拥有可以存储为用户属性的每个朋友的ID,以便稍后循环遍历它并根据id实例化朋友。

总的来说,我认为重要的一点是关于背景。创建对象的位置直接影响两个主要因素:可访问的位置和浪费的内存量。你总是需要权衡这两个并取得平衡。我最好的建议是尽可能地限制数据存在的位置和可访问的位置,仅限于那些必须存在的地方。这将使您的应用程序最安全,并使用最少的记忆。

我知道要考虑很多事情,但我希望这会有所帮助!