Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP MVC上初始化对象-查看之前或期间_Php_Oop_Object_Model View Controller_View - Fatal编程技术网

在PHP MVC上初始化对象-查看之前或期间

在PHP MVC上初始化对象-查看之前或期间,php,oop,object,model-view-controller,view,Php,Oop,Object,Model View Controller,View,我正在构建一个简单的MVC框架,并一直在关注如何设置对象 TL;DR:在视图渲染之前还是在视图渲染期间初始化对象更好 例如: 控制器 <?php class Controller { public function __construct() { $user = new User(); } } ?> <?php class User { public function __construct() { $this->s

我正在构建一个简单的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() {}
}
?>
public function getFriends() {
    $tmp = array();
    foreach($this->friends as &friend)
        $tmp[] = new Friend($friend)
    return $tmp;
}

<?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() {}
}
?>
public function getFriends() {
    $tmp = array();
    foreach($this->friends as &friend)
        $tmp[] = new Friend($friend)
    return $tmp;
}

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

作为一般经验法则:

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

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

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

其他的选择会变得更可行,这取决于你需要获得哪些关于朋友的信息。例如,当实例化一个用户时,您还可以(在构造函数中)实例化他们的每个朋友,分配给一个数组,并将他们全部保存为该用户的属性。这确实是一个笨重的对象,你必须考虑如果你使用了大量的用户,这将花费多少。 然而,你可能只在某些情况下需要朋友,所以当你需要朋友时,实例化他们可能更有意义,而不是在你不需要的时候总是拥有他们。如果是这种情况,您的用户至少应该有一个朋友的查找,并且能够在自己内部设置一个属性,该属性将保存您查找朋友所需的信息。这意味着,无论它是包含在用户构造函数中(如果您总是需要知道用户有哪些朋友),还是包含在单独的函数(如getFriends)中(如果您只是有时需要知道用户的朋友),您都需要至少拥有每个朋友的ID,该ID可以存储为用户的属性,因此,您可以稍后循环使用它,并根据id实例化朋友

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


我知道这需要考虑很多,但我希望这能有所帮助

这似乎不是非此即彼的情况。如果您获得了新数据,则需要调用setFriends来分配新对象。什么是
$this->friends
,为什么要创建一个要返回的朋友对象临时数组?我们需要更多关于代码用法的信息。调用get/set的预期用例是什么?他们打了多少次电话?在OOP中,对象通常是在您拥有初始化它们的数据后创建的。此实现的一般建议是将初始化的对象传递给视图(在foreach中)(我想将视图与模型/控制器/新对象功能分离,像另一个人构建视图一样思考..他不需要初始化friend对象(已传递)…我不知道我是否清楚(对不起,我的英语)那么,视图对于任何一个get/set函数都不是一个好地方。这些函数属于控制器,因此将视图与创建好友对象分离在一起。注意,getFriends应该返回
$this->friends
,并避免一起复制。除非将函数更改为
&getFri,否则它仍然是一个副本ends()
谢谢!帮了我大忙!!很高兴听到它的帮助!如果它解决了您的问题,请接受答案。