最近在研究php底层框架,奇怪的一点。控制器里为什么要把从model里获取的数据 需要$this->assign('items', $items); 这种形式模板文件里才可以调用到这个变量。控制器在获取到数据的时候其实就是普通require把模板文件包含进来,这样模板里里就可以调用控制器上面获取到的变量了。我特地写了简单的测试

新建 x.php文件

<?php

$a=3;
require('z.php');

新建z.php文件

<?php

echo $a;

然后localhost/x.php文件去访问

可以看到输出结果

//

然后控制器里就不行了,必须要赋值操作模板里才可以。一开始以为是框架里做了什么操作,找遍代码也没找到相关机制,然后就想,是不是类有什么隐藏机制。首先我是把模板文件直接require引用到控制器里,然后发现是可以不赋值就可以在模板里调用变量了,于是定位到加载(包含)模板文件的方法,发现他也没什么特别的啊,也是最终进行包含操作。然后跟以为java的同事在讨论。他说了句,会不会是作用域问题?我说怎么可能,百度一大堆从来都是几个包含的区别(还有对php5是错的说法);没提到作用域啊。然后我就搜了相关资料。还真找到了,但是讲的还是不太理解。于是我就自己就测试了,真的存在作用域的问题。于是我再测试

x.php代码改了下(模仿控制器,把加载的操作写在函数里)

<?php

$a=3;

function test(){
require('z.php');
}
test();

z.php里面还是这个

<?php

echo $a;

继续localhost/x.php发现报错了

意思就是没有$a这个变量 区别就出来了,而且跟我在mvc框架里发生一样的效果了。

终于明白作用域区别在这里了,reuiqre在方法里封装的话。方法外面的变量在方法里面引用的文件里是获取不到的。方法里面的变量,在方法外面也是引用不到的(读者自己去试试),引用文件里加载的方法或者类是没有作用域限制的(读者自己试试啊)。

对了,require 和include 在这里都是一样的,所以没特别说明了

顺便看下 我写的相关新区别吧

php5中require和include区别变化

require include 一个隐藏的用法:作用域。的更多相关文章

  1. [转]require(),include(),require_once()和include_once()区别

    require(),include(),require_once()和include_once()区别 面试中最容易提到的一个PHP的问题,我想和大家共勉一下: require()和include() ...

  2. JSP中的include的两种用法

    1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...

  3. 深入理解PHP之require/include顺序

    深入理解PHP之require/include顺序 作者: Laruence(   ) 本文地址: http://www.laruence.com/2010/05/04/1450.html 转载请注明 ...

  4. PHP中require(),include(),require_once()和include_once()有什么区别

    引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. require 的使用方法如 require("MyRequireFile.php"); . ...

  5. 2018/03/09 每日一学PHP 之 require_once require include include_once 包含文件的区别

    require_once require include include_once 方法的区别 对于包含文件来说,如果只是使用框架来说的话,应该会很少碰到,因为框架底层对于文件的引用等做了很好的封装, ...

  6. 【转载】PHP中require(),include(),require_once()和include_once()区别

    关于这方面的知识,这篇文章讲的较全: http://www.jb51.net/article/22467.htm require 的使用方法如 require("MyRequireFile. ...

  7. jsp中include的两种用法

    JSP中的include的两种用法 1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用 ...

  8. [PHP学习教程 - 系统]001.引用文件(require & include)

    引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. 1.require 的使用方法如 require("MyRequireFile.php"); ...

  9. Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good

    其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...

随机推荐

  1. dotnet new 命令使用模板

    dotnet new 命令使用模板快速生成单页应用. 最新版.NET Core SDK RC4 最大改动是更新了 dotnet new 命令. dotnet new 默认不再创建控制台应用,而是展示帮 ...

  2. [商业_法务] 2、注册公司起名很费劲,用C++怒写个随机名字生成器

    前言 博主最近在注册公司,由于之前听说过注册公司的名字很难通过,于是便直接找代理去帮忙跑趟,为确保万无一失,还自己绞尽脑汁想了几个很奇葩的名字(噬菌体.云木.灌木.杏仁...). 但是不幸的是那些奇葩 ...

  3. js实现菜单折叠导航

    <style type="text/css"> <!-- *{margin:0;padding:0;border:0;} body {  font-family: ...

  4. BZOJ 1898: [Zjoi2004]Swamp 沼泽鳄鱼(矩阵乘法)

    可以发现,如果没有鳄鱼,那么就是裸地一道题,但是可以发现鳄鱼最多每12次重复,那么就少于12的那部分dp,其他的就矩阵乘法就行了 PS:第一次吧矩阵乘法AC了好开心QAQ CODE: #include ...

  5. [Linux] PHP程序员玩转Linux系列-备份还原MySQL

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 前几天有个新闻,说是g ...

  6. 新学到的xss姿势,分享一下

    在js中有一种神奇的对象叫做window 当页面中包含如类似的 <script>var c = urlQuery("callback"); var r = JSON.p ...

  7. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(二)

    HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一) 下面来查看其他对保存HSTS信息的enabled_sts_hosts ...

  8. JavaScript两个变量交换值(不使用临时变量)

    概要  本文主要描述,如何不使用中间值,将两个变量的值进行交换. 一.普通做法 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp;  普通的做法就是声明多一 ...

  9. XML与JavaScript知识

    什么是XMLHttpRequest 对象? 答:XMLHttpRequest 对象用于在后台与服务器交换数据,它是开发者的梦想,因为它能够:1.在不重新加载页面的情况下更新网页:2.在页面已加载后从服 ...

  10. HTML复习