Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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_Model View Controller_View_Controller - Fatal编程技术网

Php MVC:为什么要麻烦;“发送”;将数据添加到视图中

Php MVC:为什么要麻烦;“发送”;将数据添加到视图中,php,model-view-controller,view,controller,Php,Model View Controller,View,Controller,我对MVC非常陌生,所以我一直在浏览网络,试图构建自己的框架,以真正了解整个概念是如何工作的 无论如何,几乎所有关于MVC的教程似乎总是将需要在视图中显示的数据分配给中间变量,然后在视图中使用 我的问题是,为什么要为这额外的步骤而烦恼呢 大多数MVC实现最终包括控制器中的视图。。。如果是这样的话,为什么要浪费时间/内存/cpu周期来创建一个中间变量/数组,当视图最终包含在控制器中时,该变量/数组会传递给视图呢 直接在视图本身中使用控制器变量不是更有意义吗 下面是一个代码示例,希望能澄清我的意思:

我对MVC非常陌生,所以我一直在浏览网络,试图构建自己的框架,以真正了解整个概念是如何工作的

无论如何,几乎所有关于MVC的教程似乎总是将需要在视图中显示的数据分配给中间变量,然后在视图中使用

我的问题是,为什么要为这额外的步骤而烦恼呢

大多数MVC实现最终包括控制器中的视图。。。如果是这样的话,为什么要浪费时间/内存/cpu周期来创建一个中间变量/数组,当视图最终包含在控制器中时,该变量/数组会传递给视图呢

直接在视图本身中使用控制器变量不是更有意义吗

下面是一个代码示例,希望能澄清我的意思:

class News_Controller 
{

public function main(array $getVars)
{
    $newsModel = new News_Model;

    //get an article
    $article = $newsModel->get_article($getVars['article']);

    //create a new view and pass it our template name
    $view = new View_Model($this->templateName);

    //assign article data to view
    $view->assign('title' , $article['title']);
    $view->assign('content' , $article['content']);
    $view->render();
}

渲染函数基本上只是一个include,用于将视图带入控制器,以便在整个链中显示。如果是这样的话,您可以直接在视图中使用$article,而不用麻烦地为视图分配变量。

因为控制器变量所处的范围。除非你把所有东西都全球化(这真是个坏主意),否则你的概念就行不通了。

请记住,PHP是在编写时复制的。因此,简单的变量赋值不会对性能造成重大影响

如前所述,范围是这里的一个大问题。视图与控制器是一个单独的实体,不能访问其数据。当然,您可以将控制器的实例传递给视图,但这会在两者之间创建不必要的过于严格的耦合。视图应该能够独立于控制器工作

因此,通过显式地将数据分配给视图,可以将两者解耦。因此,您将倾向于编写更好、更干净的代码

其次,将数据分配给视图的过程可以进行一些数据清理或其他额外工作。例如,在我的框架中,我认为传递给HTML视图的所有数据都是不安全的。将数据传递到视图时(除非明确标记为安全),数据将通过
htmlspecialchars
进行编码

最后,始终可以将对象或阵列指定给视图:

$view->assign('article', $article);

如果你这样做,你通常不需要分配太多的东西。(如果你这样做了,也许你的页面做了太多不同的事情。)

MVC是一个非常松散的分类。您描述的是它可以工作的一种方式。您在控制器中使用的变量也可能不打算在视图中使用。您可能有某种类型的模板处理器,它从控制器接收数据,以及一个特别标记的视图模板,并输出结果。或者,您可能正在从视图中调用返回现成标记的函数/方法。

您的include从render()方法的变量范围继承所有内容,但render()方法不会从控制器的变量范围继承任何内容

class foo {

   public function bar() {
      echo $somevar;
   }
}

$somevar = 'test';
$foo = new foo();
$foo->bar();
此代码将不回显任何内容,并警告尚未定义$somevar(如果错误报告设置为显示警告)。这是因为方法和函数不继承调用它们的范围

php.net/manual/en/language.variables.scope.php


php.net/manual/en/language.oop5.visibility.php

在Faux/webmvc框架中,将值从“controller”传递到“view”的方法是不同的。虽然重用局部作用域也同样可行,但通常会创建一个值对象或数组来进行外观和假设视图变量有一个“收集”过程。在上面的代码中,如果视图对象没有以某种方式传递到视图中,您希望视图对象如何访问控制器对象中的变量?另外,似乎您可以简单地将整个文章传递到视图中,而不是逐个传递每个文章变量。@dqhendricks,$view->render()方法基本上只是“include('view.php'),因此视图包含在控制器中。一旦发生这种情况,控制器中的变量就变成视图文件中的局部变量。从我在网络上看到的例子来看,视图总是在某个时刻包含在控制器中。是否有另一种方法可以呈现视图而不将其包含在控制器中,而控制器又包含在index.php文件中@Chrys G.我认为您对变量作用域在PHP中的工作方式感到困惑。仅仅因为render方法是从controller对象内调用的,并不意味着它继承其变量范围。属于视图的方法只能访问视图的变量范围。另外,从我到目前为止看到的情况来看,include将所有内容都纳入范围,因为它包含在声明变量的同一个函数中。@Chrys G.是的,include从render()方法范围继承所有内容,但render()方法方法没有从控制器继承任何内容。我想我正在进入我不理解的部分。我知道render()不会从控制器继承任何内容,因为它是另一个类的方法,如果以Java为例,肯定需要将变量传递给View类/viewfile。但是,由于include将控制器的main()方法中声明的所有变量都带到了作用域中,那么作用域的问题不是一个没有意义的问题吗?@Chrys G.include的作用域与调用它的位置相同。由于它是在render方法中调用的,因此它与render方法共享相同的范围。include与将文件内容复制并粘贴到包含include语句的代码中基本相同。这有意义吗?我完全理解你的意思,但是考虑到php/includes的工作方式,一旦视图包含到要显示的控制器中,控制器中的所有变量都将成为视图的局部变量。那是