require include 一个隐藏的用法:作用域。
最近在研究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 在这里都是一样的,所以没特别说明了
顺便看下 我写的相关新区别吧
require include 一个隐藏的用法:作用域。的更多相关文章
- [转]require(),include(),require_once()和include_once()区别
require(),include(),require_once()和include_once()区别 面试中最容易提到的一个PHP的问题,我想和大家共勉一下: require()和include() ...
- JSP中的include的两种用法
1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...
- 深入理解PHP之require/include顺序
深入理解PHP之require/include顺序 作者: Laruence( ) 本文地址: http://www.laruence.com/2010/05/04/1450.html 转载请注明 ...
- PHP中require(),include(),require_once()和include_once()有什么区别
引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. require 的使用方法如 require("MyRequireFile.php"); . ...
- 2018/03/09 每日一学PHP 之 require_once require include include_once 包含文件的区别
require_once require include include_once 方法的区别 对于包含文件来说,如果只是使用框架来说的话,应该会很少碰到,因为框架底层对于文件的引用等做了很好的封装, ...
- 【转载】PHP中require(),include(),require_once()和include_once()区别
关于这方面的知识,这篇文章讲的较全: http://www.jb51.net/article/22467.htm require 的使用方法如 require("MyRequireFile. ...
- jsp中include的两种用法
JSP中的include的两种用法 1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用 ...
- [PHP学习教程 - 系统]001.引用文件(require & include)
引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. 1.require 的使用方法如 require("MyRequireFile.php"); ...
- Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good
其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...
随机推荐
- 安卓UDP通信
功能: 实现了单次一发一收: import java.net.*; import java.io.*; public class udpRecv { /* * 创建UDP传输的接收端 * 1.建立ud ...
- Qt之hello world
本人使用的是Qt5.7版本的,请读者自主下载安装. 今天首先来进行Qt入门的第一个程序,也是很经典的一个例子.这是在很多的变成语言中都会用到的例子,就是输出helloworld这个信息.Qt中使用的变 ...
- SharePoint 2016 配置应用程序商店
最近碰到一个新的需求,就是要给SharePoint配置应用程序商店,挺有意思的,就简单的配置和记录了一下,分享给大家. 其实应用程序商店之前感觉很鸡肋,但是用起来还是不错的.不喜勿喷,呵呵. 首先需要 ...
- Loadrunner 在controller中运行socket脚本时报错:Abnormal termination, caused by mdrv process termination 的原因和解决方法
原因: 网上给出的可能的原因大致有两个: 1. 压力负载机器的资源不足(CPU,内存) 2. 分配内存和释放内存的语句不匹配. 并给出了一些解决方案,最开始我以为是加了IP地址的原因,不断尝试增加 ...
- android学习17——命令行建gradle工程
使用命令行建gradle工程要涉及到几个工具的版本. 1.gradle的版本.这个用gradle -version查到. 2.SDK BuildTools的版本. 这个要先配好SDK的环境变量,然后在 ...
- XHTML表格
1.基本格式: <table> <tr> <th>A</th><th>B</th><th>C</th>& ...
- 每天一个linux命令(43)--netstat命令
netstat 命令用于显示与 IP TCP UDP 和 ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat 是在内核中访问网络及相关信息的程序,它能提供TCP连接,T ...
- 一个想法照进现实-《IT连》创业项目:万事开头难
前言: 之前是一个想法,现在已经进入创业阶段,所以这个系列的标题,改了. 众筹的事在今天也停止了. 7-9号会在深圳龙岗布吉参加一个风投对接的活动,今晚(6号)会出发. 因为:在深圳会呆几天,而且这个 ...
- db2 load乱码问题
在使用db2过程中经常需要从一个库里拿数据到自己库里来,通常需要将源表的数据导为数据文件,通过数据文件load到自己库里. 这个过程如果两个库的字符编码不一致,常规导入导出就会出现中文乱码. 以下是两 ...
- 《Shell脚本学习指南》学习笔记之变量、判断和流程控制
变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...