简介
php中用于包含其他文件的指令包括:include、require、include_once、require_once
假如要在index.php中导入外部的other.php,可以使用如下4个语句之一:
include "path/other.php";
require "path/other.php";
include_once "path/other.php";
require_once "path/other.php";
注意,这些语句实际上是一种特殊的语言结构,而非函数,其参数不需要括号。比如:include('other.php') == 'OK'将会被解析为:include (('other.php') == 'OK')
比如有这样一个用于被导入的文件:
other.php
<?php
function sayHello($name)
{
return "Hi, ".$name."!<br>";
}
echo sayHello("Jeck");
可以在别的文件里进行导入:
index.php
<?php
include "other.php";
echo sayHello("Obama")
?>
要注意的是,这两个文件都必须用 <?php 进行标记。
路径寻找
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找(include_path是一个在php.ini配置文件在设置的配置项)。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则会发出一条警告(include结构)或发出一个致命错误(require结构)。
如果定义了路径(不管是绝对路径还是相对路径),include_path 都会被完全忽略。
区别
1.当有错误发生时,include和include_once仅会造成警告错误(程序不会终止执行),而require和require_once则会造成严重错误(程序终止执行)。
2.include_once和require_once仅会载入外部的php文件一次,不会重复载入。通过这两个函数,可以有效的避免重复定义函数。也就是说如果发现要导入的文件已经导入过了,则会自动忽略操作:
<?php
include "other.php";
include_once "other.php";
echo sayHello("Obama")
?>
这段代码工作正常,而且第二次导入"other.php"的操作会被忽略,而不是导致出错。若第二个语句换成include,则运行出错。多次导入主要的问题在于导致重复定义,如果确定不会出现这样的问题,例如要导入的文件中之中只有简单的echo语句,则可以使用include。
变量作用域
当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。
other.php
<?php
echo $a;
$b = '$b';
index.php
$a = '$a';
include './other.php';
echo "\n".$b;
--------------------$a
$b
处理返回值
在失败时 include 返回 FALSE 并且发出警告。成功时返回1,除非在包含文件中另外给出了返回值。
可以在被包括的文件中使用 return 语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得 include 调用的返回值。
如果在包含文件中定义有函数、类等,这些函数或类不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。
$a = include './../other.php';
var_dump($a); // bool(false)
$a = include './other.php';
var_dump($a); // int(1)
结合命名空间的文件导入
下面的例子导入一个包含在命名空间里的脚本,分别在函数内和函数外进行导入。
被导入的脚本:inc.php
<?php
namespace MyNS
{
$myns = 4; // 一个变量
return 0; // 脚本返回
$test = 5;
class MyClass // 一个类
{
public static $Num = 1024;
}
function SetNum($x) { // 一个函数
MyClass::$Num = $x;
}
}
<?php
namespace MyCode
{
require "inc.php";
\MyNS\setNum(3); // 命名空间并不在MyCode中,也不能省略名称空间限定
echo \MyNS\MyClass::$Num; // 被包含脚本中return之后的类和函数都可访问
echo $myns; // 可以访问
//echo $test; // 不能访问
}
函数内导入脚本:
<?php namespace MyCode { function req() { require "inc.php"; echo $myns; // 访问正常 //echo $test; // 访问出错 } req();
\MyNS\setNum(3); // 需要在执行过函数后才能访问 echo \MyNS\MyClass::$Num; // 需要在执行过函数后才能访问}//echo $myns; // 不能再访问$myns
相关函数
array get_included_files ( void )
array get_required_files ( void )返回所有被 include、 include_once、 require 和 require_once 的文件名。两个函数只是名字不同,作用相同。
注意:
1.被多次 include 和 require 的文件在返回的 array 里只会列出一次。
2.调用此函数的文件本身也会包含在返回的数组中
3.使用 auto_prepend_file 配置指令所包含的文件不会包含在返回的数组里。