# 四、命名空間的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腳本時,報錯了

第一個是警告:內容為無法打開這個文件,不存在這樣的文件夾或者文件
第二個就是錯誤:這是一個致命錯誤,打開文件失敗,也就是無法引入,此時的錯誤警告級別為致命錯誤,這樣的錯誤是無法繼續執行腳本的!只有警告和提示的級別才會繼續執行腳本!
所以也就驗證了我們上面所說的
剩下的我們就不測試了,大家可以親自測試下
那我們說下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攻擊的介紹