# 四、命名空间的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才可用!
到这里基本上都分析完毕了!
- 一、php封装pdo操作类
- 二、PHP 3des 加密类
- 三、PHP 调用webserver服务器详解
- 四、命名空间的USE 和 require include require_once include_once详解
- 五、thinkphp集成小米推送
- 六、PHP实现上传文件进度条
- 七、PHP根据地址新建路径下载地址文件
- 八、PHP使用AJAX上传图片即时预览
- 九、强制CDN更新静态资源文件
- 十、THINKPHP集成支付宝APP支付并提供接口
- 十一、THINKPHP集成支付宝APP支付 错误详解 支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247 dengg
- 十二、PHP生成二维码图片或带logo的二维码
- 十三、蛋疼的bom头 恶心了我好久[json无法解析]
- 十四、php windows安装imagick扩展
- 十五、windows下Composer的安装与使用
- 十六、[2017]最新支付宝wap支付集成THINKPHP3.2.3 demo
- 十七、VUE.JS 安装与发布
- 十八、PHP 执行 linux 命令行 操作示例
- 十九、关于CSP 减少XSS攻击的介绍