php中的文件包含 include,require,include_once,require_once

文件包含:是指将一个文件的内容包含进另外一个文件,有利于代码的复用等。
php中文件包含指令有4个,分别为:
include,include_once,require,require_once
其中:include和require:使用一次便包含一次文件;而include_once和require_once则是:不管在一个脚本中包含
另外一个脚本多少次,都只加载一次,不会重复,这样可以避免因一个文件的重复包含,导致的函数重定义等问题。
include_once和require_once在包含文件之前会做一次判断,判断当前需要包含的文件是否已经被包含过了,如果
已经包含过了就放弃包含,否则就包含进来。

include和require的区别是:include会尝试着去包含,如果包含不到,会提示警告错误,但是不会影响当前自身脚
本的执行;require一定会去包含文件,而且包含的文件必须不能出错,否则会终止当前自身脚本的执行。

关于文件包含的使用,php帮助手册中提到有些需要注意的地方,可以帮助理解文件包含的机制,从而避免不必要的
麻烦:
1.被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找
。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如
果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。
2.当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可
用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
3.如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函
数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被
解析器处理的。
4.在失败时 include 返回 FALSE 并且发出警告。成功的包含则返回 1,除非在包含文件中另外给出了返回值。可以
在被包括的文件中使用 return语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返
回值。可以像普通函数一样获得 include 调用的返回值。
5.因为 include 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意:
if (include('vars.php') == 'OK') { // won't work, evaluated as
echo 'OK' ; // include(('vars.php') == 'OK')
}
if ((include 'vars.php') == 'OK') { // works
echo 'OK' ;
}
6.如果在包含文件中定义有函数,这些函数不管是在 return之前还是之后定义的,都可以独立在主文件中使用。如果
文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return之后定义的函数报错。推荐
使用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回。
7.当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此
原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。
ps:我的理解是,包含文件时,会把被包含的整个文件原样放在目标文件中,然后才去解析,基于以上第3点,可知,
魔术常量是在此之前解析的,是个例外。

php学习笔记6--php中的文件包含 include,require,include_once,require_once的更多相关文章

  1. php 文件包含 include、include_once、require、require_once

    简言之,include某文件:把某文件的代码粘过来,如果该文件不存在,也继续执行下面的代码,带_once的是看看之前引用过没,引用过就不引用了(_once这行代码的心里活动:“之后引用过没有我不关心, ...

  2. 【学习笔记】python3中csv文件使用

    1. reader=csv.reader(f, delimiter=','):按行读取数据,reader为生成器,读取的每行数据为列表格式,可以通过delimiter参数指定分隔符. import c ...

  3. 【学习笔记】python3中yaml文件使用

    1.yaml -> 字典:用yaml.load()或yaml.safe_load(YAML字符串或文件句柄),如yaml中有中文,可以使用.encode('utf-8')或打开文件时指定enco ...

  4. 并发编程学习笔记(4)----jdk5中提供的原子类及Lock使用及原理

    (1)jdk中原子类的使用: jdk5中提供了很多原子类,它会使变量的操作变成原子性的. 原子性:原子性指的是一个操作是不可中断的,即使是在多个线程一起操作的情况下,一个操作一旦开始,就不会被其他线程 ...

  5. Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. [学习笔记] 在Eclipse中导入项目

    参考前文:[学习笔记] 在Eclips 中导出项目 选择已经导出的文件: 导入之后,项目结构如下: 至此,完成.

  7. [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar在子目录中

    工程创建可参考前文: [学习笔记] 在Eclipse中使用Hibernate,并创建第一个工程,数据库为Oracle XE 在工程上鼠标右键: 找到java 选择 Runable JAR file N ...

  8. Web安全学习笔记 SQL注入中

    Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...

  9. Java学习-040-级联删除目录中的文件、目录

    之前在写应用模块,进行单元测试编码的时候,居然脑洞大开居然创建了一个 N 层的目录,到后来删除测试结果目录的时候,才发现删除不了了,提示目录过长无法删除.网上找了一些方法,也找了一些粉碎机,都没能达到 ...

随机推荐

  1. 以Outlook样式分组和排列数据项

    转载:http://www.cnblogs.com/peterzb/archive/2009/05/29/1491781.html OutlookGrid:以Outlook样式分组和排列数据项 (这里 ...

  2. C# 动态执行批处理命令

    本文转载:http://www.cnblogs.com/lenic/p/4097045.html C# 动态执行一系列控制台命令,并允许实时显示出来执行结果时,可以使用下面的函数.可以达到的效果为: ...

  3. VC++ 网络编程总结(二)

    2.基本的Windows Socket API编程 需要在程序中添加下面的包含语句:#include <winsock2.h>   #pragma comment( lib, " ...

  4. apache2 添加perl支持

    官方文档,很详细了. https://httpd.apache.org/docs/2.0/howto/cgi.html#configuring   我修改了/etc/apache2/sites-ava ...

  5. 【转】REST on Rails指南

    REST on Rails指南1:理解资源 这是来自http://www.softiesonrails.com的REST简明指南. PART I 在理解REST on Rails之前,有必要先思考一下 ...

  6. 64位ubuntu下装32位软件

    本帖最后由 wuy069 于 2013-10-25 12:28 编辑 很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软 ...

  7. DLX舞蹈链 hdu5046

    题意: 在N个城市选出K个城市,建飞机场(1 ≤ N ≤ 60,1 ≤ K ≤ N),N个城市给出坐标,选择这K个机场,使得从城市到距离自己最近的机场的 最大的距离 最小. 输出这个最小值. 思路: ...

  8. ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

    在布局添加控件手动添加还是拖的添加,添加edittext后布局就不好用,其他控件好用,然后就说下面这段话 Exception raised during rendering: java.lang.Sy ...

  9. AJAX responseText vs responseXML

    AJAX------>本质 Request/Response(Server)模式 response的形式 responseText--------->获得字符串形式的响应数据. ----- ...

  10. mobile响应式页面meta信息相关记录

    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scal ...