# 四、命名空间的USE 和 require include require\_once include\_once详解 > ## 命名空间的USE 和 require include require\_once include\_once详解 include是包含的意思,找不到文件时,会报warning的错误,然后程序继续往下执行 require是必须的意思,找不到文件时,会报fatal error (致命错误),程序停止往下执行 这两个引入,在加once后,在引入的时候会判断是否存在,不存在才会引入 我们来几个例子说明: ``` ##### a.php //我们在 a.php文件写入一个函数,输出:我被引入了 function test(){ echo "我被引入了!"; } //并且调用了函数 test(); ##### b.php //我们在b.php 先 include a.php include "a.php"; #此时,输出:我被引入了, ``` 说明,我们在include的时候,会将被引入的脚本加载到当前脚本,说白了也就是两个脚本合并为一个脚本了! 我们再试试如果没这个脚本呢: ``` ##### a.php //我们在 a.php文件写入一个函数,输出:我被引入了 function test(){ echo "我被引入了!"; } //并且调用了函数 test(); ##### b.php //我们在b.php 先 include ccc文件夹下的 a.php include "ccc/a.php"; echo 222; #此时,输出:警告 222 ``` 我们include的文件,根本不存在,因为我们就没有 ccc这个文件夹,所以,引入是失败的,所以验证了上述说的:include引入不存在的文件会发出警告,但是不影响程序运行, 因为我们执行b.php脚本的时候,输出了 222 我们接下来测试once的情况 我们不需要修改a.php,只需要对b.php稍作修改即可 ``` <pre class="calibre10">``` include 'a.php'; include_once "a.php"; echo 222; ``` 我们在b.php引入了两次a.php,脚本输出内容为: 我被引入了!222 为什么我们引入两次,却输出了一次呢,这就是once的作用了,如果你把once写在include前面,那么,就会输出两次了(本例不能这样执行,因为已经存在test函数,如果引入两次,函数名重复就报错了!可以将a.php只输出一串字符串作为引入测试脚本),因为在once 之前,a.php不存在,则会被引入,而include并不会判断是否存在 接下来我们测试下 require 的 ``` ###我们这次为了方便测试,直接将a.php改为以下内容 echo "我被引入了!"; #####我们再次修改b.php require "a.php"; echo 222; ``` 此时,这个脚本输出的内容为: 我被引入了!222 最上面说过, require 引入不存在的文件,会直接报错,不会继续执行脚本了,是真的吗?我们先测试下 ``` ##我们无需修改a.php ###我们修改下b.php require "ccc/a.php"; echo 222; ``` 我们 require 了ccc文件夹下的b.php,这个文件不存在,当我们执行我们的b.php脚本时,报错了 ![](https://box.kancloud.cn/f54f10b4af40490571ae09da8cc1c87e_1283x265.png) 第一个是警告:内容为无法打开这个文件,不存在这样的文件夹或者文件 第二个就是错误:这是一个致命错误,打开文件失败,也就是无法引入,此时的错误警告级别为致命错误,这样的错误是无法继续执行脚本的!只有警告和提示的级别才会继续执行脚本! 所以也就验证了我们上面所说的 剩下的我们就不测试了,大家可以亲自测试下 那我们说下USE 和他们的区别 我们先看一个例子 ``` ###这是a.php <?php namespace test; /** * Created by PhpStorm. * User: Wei * Date: 2017/5/23 * Time: 9:34 */ class a{ public function test(){ echo "这是 a 类下的 test方法"; } } ####这是b.php <?php /** * Created by PhpStorm. * User: Wei * Date: 2017/5/23 * Time: 9:35 */ require "a.php"; $test = new \test\a(); $test->test(); ``` 我们只是引入了这个类,并且实例化后执行了test类中的test方法,这也就是我们之前命名空间教程中提到的完全限定名称的使用 我们修改下,使用use 来使用 ``` ###我们只修改了b.php use test; $test = new \test\a(); $test->test(); //此代码有个警告 ``` 我们在执行这个代码的时候,发现有个警告和一个错误 为什么报错了呢?我们一步一步看! 第一步,报错为这个使用是不符合规则的,因为这个类不存在,必须存在的类才可以use 第二步:我们在实例化a类时,去检测这个类是否存在,存在才会被实例化,然而这个有个致命错误:找不到这个类 发现了么?这个类没有被引入,可能有些人比较含糊,我是不是在命名空间下使用use 就会引入这个类了呢? 我们继续写例子,作说明 ``` ###我们仍然只修改b.php <?php namespace test; /** * Created by PhpStorm. * User: Wei * Date: 2017/5/23 * Time: 9:35 */ use test\a; $test = new a(); $test->test() ``` 司机们,这个会正确执行吗? 当然是不会了,又报错了,而且这个错误跟上面的第二个错误是一样的,致命错误 还会找不到这个类,为什么呢? 司机们要了解,use 使用,并不会引入任何文件,只是申明这个类的别名,后面跟的是他的别名规则.所以,在使用use的时候必须要引入! 所以,稍加修改,即可 ``` ### b.php <?php namespace test; use test\a; include "a.php"; $test = new a(); $test->test(); ###这样就可以正确执行了 ``` 此时,细心的司机发现,use 其实是并没有被使用的,因为她们是同一个命名空间,去掉命名空间或者不同命名空间,use才可用! 到这里基本上都分析完毕了!