最近在研究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. 基于Ubuntu14.04-LTS下安装docker

    1.sudo apt-get update --更新系统源 2.sudo apt-get install docker.io 3.将docker库的公钥中加入到本地apt中 sudo apt-key ...

  2. 纯js实现html转pdf

    项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式.简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf.咋不上天呢--查了一下 ...

  3. js设计模式--迭代器模式

    迭代器模式: 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示.js中我们经常会封装一个each函数用来实现迭代器. 理解的意思:提供一个方法,去把对象的每一项按 ...

  4. 《剑指offer》— JavaScript(1)二维数组中的查找

    二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ** ...

  5. kafka c++客户端编译

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据通常是 ...

  6. 【Eclipse】web项目部署新手篇

    本文属于新手篇章,记录了Eclipse中部署web项目的步骤 1 . 添加Tomcat服务器 右键项目属性-->Run as-->Run on server弹出以下界面 点击finish之 ...

  7. 第六篇 项目疑问 ------- BaseService<T> where T : class, new() 含义

    public abstract class BaseService<T> where T : class, new() { //当前仓储 //DbSession的存放 //为了职责单一的原 ...

  8. Androidstudio项目分享到Git@OSC托管

    Androidstudio项目分享到Git@OSC托管. 一.在OSC创建仓库 例如,创建一个AndroidStudy仓库,创建步骤如下: 输入仓库名称 点击创建按钮,就可以完成仓库的创建,如下图所示 ...

  9. 普实软件:MES机器数据维护

    概述 机器数据有两个菜单,机器主数据在制造数据模块下,机器MES数据相关的设置在MES模块下,两个菜单查看的内容是一致的,但是机器主数据显示的是普通的机器,可做新增.编辑.删除操作,机器MES数据仅做 ...

  10. BFC原理

    一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...