分享免费的编程资源和教程

网站首页 > 技术教程 正文

PHP 你真的了解INCLUDE、REQUIRE吗?

goqiw 2024-09-14 07:00:38 技术教程 41 ℃ 0 评论

在PHP中有两个引入文件的语言结构:include、require

1、注意这两个都是语言结构不是方法,与echo、print、isset()、empty()、unset()等类似都是语言结构不是函数!!!!!

2、include与require都是引入外部文件到当前上下文环境,但是他们有一些区别:

一、被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。(在这点上include_once与require_once类似,但是他们在导入一个已导入的文件都会忽略,但是他们在引入文件时会判断是否引入会降低性能)

二、关于引入的文件:当一个文件被包含时,其中所包含的代码继承了 include、require 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

EG1:

vars.php

<?php

$color = 'green';

$fruit = 'apple';

?>

test.php

<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。

3、include返回值:

处理返回值:在失败时 include 返回 FALSE 并且发出警告。成功的包含则返回 1,除非在包含文件中另外给出了返回值。可以在被包括的文件中使用 return 语句来终止该文件中程序的执行并返回调用它的脚本。同样也可以从被包含的文件中返回值。可以像普通函数一样获得 include 调用的返回值。不过这在包含远程文件时却不行,除非远程文件的输出具有合法的 PHP 开始和结束标记(如同任何本地文件一样)。可以在标记内定义所需的变量,该变量在文件被包含的位置之后就可用了。因为 include 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

EG2:

<?php

// won't work, evaluated as include(('vars.php') == TRUE), i.e. include('')

if (include('vars.php') == TRUE) {

echo 'OK';

}

// works

if ((include 'vars.php') == TRUE) {

echo 'OK';

}

讲解:

$bar 的值为 1 是因为 include 成功运行了。注意以上例子中的区别。第一个在被包含的文件中用了 return 而另一个没有。如果文件不能被包含,则返回 FALSE 并发出一个 E_WARNING 警告。如果在包含文件中定义有函数,这些函数不管是在 return 之前还是之后定义的,都可以独立在主文件中使用。如果文件被包含两次,PHP 5 发出致命错误因为函数已经被定义,但是 PHP 4 不会对在 return 之后定义的函数报错。推荐用 include_once 而不是检查文件是否已包含并在包含文件中有条件返回.

3、include引入文件的处理:(这点很重要)

当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。并且当执行完成之后直接加入到缓冲区,将被导入的文件中的变量加入到当前的作用域变量链上。

EG3:

//t1.php 文件内容

1234<?php $name="PQS"; ?>5678<?php return 1; ?>9

//t2.php文件内容

<?php

include "t1.php";

echo $name;

//开始执行t2.php

会输出:12345678PQS

案例解析:

首先当include "t1.php";文件时PHP解析器脱离PHP模式进入HTML模式开始解析,因为HTML模式是将内容直接加入到缓冲区,所以没有标签1234会被首先加入到缓冲区,然后在执行<?php $name="PQS"; ?>这里就会把$name这个变量加入到t2.php的include "t1.php"这句代码的上线文变量作用域中。然后接着在回到HTM模式将5678加入到缓冲区,接下来遇到<?php return 1;?>就开始进入PHP模式进行执行代码,因为include是接受return的,所以当这里return 1之后整个文件的加载就到此处结束了, 返回到t2的代码执行域中了,这也是为什么最后没有输出9的原因。

举个例子证明PHP将文件输入到缓冲区:

//t3.php

1234567

//t4.php

<?php

$string = get_include_contents('t3.php');

function get_include_contents($filename) {

if (is_file($filename)) {

ob_start();

include $filename;

$contents = ob_get_contents();

ob_end_clean();

return $contents;

}

return false;

}

echo $string;

//执行t4.php

1234567

案例分析:

函数get_include_contents($filename)

在include之前开启缓冲区,当include将t3.php文件引入后就使用ob_get_contents()方法获取缓冲区数据赋值给$contents,然后使用ob_end_clean将缓冲区数据丢弃最后将$contents返回,最后输出返回值就是t3.php在经过php运行的值。

4、include支持引入URL:

如果“URL include wrappers”在 PHP 中被激活,可以用 URL(通过 HTTP 或者其它支持的封装协议——见支持的协议和封装协议)而不是本地文件来指定要被包含的文件。如果目标服务器将目标文件作为 PHP 代码解释,则可以用适用于 HTTP GET 的 URL 请求字符串来向被包括的文件传递变量。严格的说这和包含一个文件并继承父文件的变量空间并不是一回事;该脚本文件实际上已经在远程服务器上运行了,而本地脚本则包括了其结果。

<?php

/* This example assumes that www.example.com is configured to parse .php *

* files and not .txt files. Also, 'Works' here means that the variables *

* $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the

// local filesystem.

include 'file.php?foo=1&bar=2';

// Works.

include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;

$bar = 2;

include 'file.txt'; // Works.

include 'file.php'; // Works.

此案例是PHP官网案例,如果不懂之处请移步值PHP官网include章节!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表