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


Initializing objects on PHP MVC - before view or during

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

TL;DR:在视图之前或在视图渲染期间初始化对象更好吗?

的例子:控制器

<?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() ..
}
?>
<<p> 视图/strong>
<?php
foreach($user->getFriends() as $friend){
    .. $friend is a Friend Object already ..
    .. html...
}
?>

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

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对象才会初始化。

作为一般的经验法则:

使每个页面加载所需的任何东西都应该在初始化的早期普遍需要(通常在引导层或类似的层中)。这包括基本控制器(其他控制器的扩展)、基本视图(这里也是一样)、数据库处理程序对象等。

任何特定于一个页面的东西,就像你似乎正在与用户和朋友描述的那样,应该在处理加载该页面的控制器或控制器动作中加载。这有助于使您的代码集中,并减少内存占用。

在这些情况下,最好将尽可能多的业务逻辑移出视图,并将PHP保存在视图中,以便进行循环和回调等简单操作。在MVC框架中,你经常会看到控制器中内置的数组,这样很多已经完成的数据就可以传递给视图。例如,在你的控制器中,你可以实例化你的用户作为参数传递给视图,然后也实例化你的朋友,并将他们全部添加到你作为另一个参数传递的朋友数组中。或者将这两个数组组合成一个大数组,并向视图传递单个"parameters"参数。这将是一个标准的参数,你所有的视图可以共享,然后选择数据数组发生在视图本身。

其他选项变得更可行,这取决于你需要获得哪些关于朋友的信息。例如,当实例化一个用户时,您也可以(在构造函数中)实例化他们的每个朋友,赋值给一个数组,并将它们全部保存为该用户的属性。这确实会使对象变得更笨重,并且您必须考虑如果使用很多用户,这将花费多少钱。

然而,你可能只在某些情况下需要朋友,所以在你需要他们的时候实例化他们可能更有意义,而不是在你不需要他们的时候总是拥有他们。如果是这种情况,您的用户至少应该能够查找其好友,并能够在其内部设置一个属性,该属性将包含查找好友所需的信息。这意味着,无论它是包含在用户构造函数中(如果总是需要知道用户有哪些朋友),还是包含在像getFriends这样的单独函数中(如果只是有时需要知道用户的朋友),都需要至少有每个朋友的ID,该ID可以存储为用户的属性,以便稍后可以循环遍历它并基于ID实例化朋友。

总的来说,我认为重要的一点是关于上下文。在哪里创建对象会直接影响两个主要因素:在哪里可以访问对象,以及浪费了多少内存。你总是需要权衡这两者并取得平衡。我最好的建议是限制数据存在的位置和尽可能多地访问数据的位置,只在必须的位置。这将使您的应用程序最安全,并使用最少的内存。

我知道这需要考虑很多,但我希望这对你有帮助!