PHP引入檔案的方式有哪些?PHP引入檔案有四個語句:
include、require、include_once、require_once,下面我們就來看看PHP引入檔案的具體執行個體。
基本文法
require:require函數一般放在PHP指令碼的最前面,PHP執行前就會先讀入require指定引入的檔案,包含並嘗試執行引入的指令檔。require的工作方式是提高PHP的執行效率,當它在同一個網頁中解釋過一次後,第二次便不會解釋。但同樣的,正因為它不會重複解釋引入檔案,所以當PHP中使用迴圈或條件陳述式來引入檔案時,需要用到include。
include:可以放在PHP指令碼的任意位置,一般放在流程式控制制的處理部分中。當PHP指令碼執行到include指定引入的檔案時,才將它包含並嘗試執行。這種方式可以把程式執行時的流程進行簡單化。當第二次遇到相同檔案時,PHP還是會重新解釋一次,include相對於require的執行效率下降很多,同時在引入檔案中包含使用者自訂函數時,PHP在解釋過程中會發生函數重複定義問題。
require_once / include_once:分別與require / include作用相同,不同的是他們在執行到時會先檢查目標內容是不是在之前已經匯入過,如果匯入過了,那麼便不會再次重複引入其同樣的內容。
相互區別
include和require:
include有傳回值,而require沒有傳回值
include在負載檔案失敗時,會產生一個警告(E_WARNING),在錯誤發生後指令碼繼續執行。所以include用在希望繼續執行並向使用者輸出結果時。
//test1.php<?phpinclude './tsest.php';echo 'this is test1';?>//test2.php<?phpecho 'this is test2\n';function test() { echo 'this is test\n';}?>//結果:this is test1
require在載入失敗時會產生一個致命錯誤(E_COMPILE_ERROR),在錯誤發生後指令碼停止執行。一般用在後續代碼依賴於載入的檔案的時候。
//test1.php<?phprequire './tsest.php';echo 'this is test1';?>//test2.php<?phpecho 'this is test2\n';function test() { echo 'this is test\n';}?>
結果:
include和include_once:
include載入的檔案不會判斷是否重複,只要有include語句,就會載入一次(即使可能出現重複載入)。而include_once載入檔案時會有內部判斷機制判斷前面代碼是否已經載入過。這裡需要注意的是include_once是根據前面有無引入相同路徑的檔案為判斷的,而不是根據檔案中的內容(即兩個待引入的檔案內容相同,使用include_once還是會引入兩個)。
//test1.php<?phpinclude './test2.php';echo 'this is test1';include './test2.php';?>//test2.php<?phpecho 'this is test2';?>//結果:this is test2this is test1this is test2//test1.php<?phpinclude './test2.php';echo 'this is test1';include_once './test2.php';?>//test2.php<?phpecho 'this is test2';?>//結果:this is test2this is test1//test1.php<?phpinclude_once './test2.php';echo 'this is test1';include './test2.php';?>//test2.php<?phpecho 'this is test2';?>//結果:this is test2this is test1this is test2//test1.php<?phpinclude_once './test2.php';echo 'this is test1';include_once './test2.php';?>//test2.php<?phpecho 'this is test2';?>//結果:this is test2this is test1
require和require_once:同include和include_once的區別相同。
載入時執行過程
1. 從include(require)語句退出php指令碼模式(進入html代碼模式)
2. 載入include語句所設定的檔案中的代碼,並嘗試執行
3. 退出html模式,重新進入php指令碼模式,繼續後面指令碼程式的執行
//test1.php<html><body>主檔案開始位置:<?php echo "<br> 主檔案中位置 A"; include "./test2.php"; //要載入的檔案 echo "<br> 主檔案中位置 B";?><br> 主檔案結束位置</body></html>//test2.php<br> 被載入檔案位置 1<?phpecho "<br> 被載入檔案位置 2";?><br> 被載入檔案位置 3
結果:
分析:
載入時的路徑問題
相對路徑:
相對於當前網頁檔案所在位置來定位某個被載入的檔案位置。
./ 表示表示當前位置,即當前網頁檔案所在的目錄. . / 表示上一級位置,即當前網頁檔案所在目錄的上一級目錄//例如:include "./test2.php";require "../../test3.html";
絕對路徑:
分為本地絕對路徑和網路絕對路徑
本地絕對路徑:
從本地的根目錄逐層遞迴向下找,直到找到對應目錄下的待引入檔案。
include "C:/PHP/test/test2.php";
我們都知道,絕對路徑不利於項目的移植和可維護性,所以一般很少在代碼中直接這樣寫絕對路徑,但是如果我們需要用到絕對路徑,應該怎麼辦??PHP中有魔術常量__DIR__和全域數組$_SERVER,用法如下:
<?phpdefine('DS') or define('DS',DIRECTORY_SEPARATOR);echo "使用絕對路徑引入(方法一)";include __DIR__ . DS . 'test2.php';echo "使用絕對路徑載入方法(方法二)";$root = $_SERVER['DOCUMENT_ROOT']; // 獲得當前網站的根目錄include $root.DS.'node_test'.DS.'inAndRe'.DS. 'test2.php';?>
網路絕對路徑:
通過網址連結到檔案下,伺服器會將網址指向的檔案執行後返回回來
include "http://www.lishnli/index.php"
無路徑:
只給出檔案名稱而沒有給出路徑資訊,此時PHP會在當前網頁目錄下找該檔案,如果找到相同名字的檔案,執行並引入。
需要注意:無論採用哪種路徑,必須要加上檔案尾碼名,這四種檔案載入方式不能識別無尾碼的檔案。
//test1.phpinclude "./test2.php";//結果:this is test2//test1.phpinclude "./test2";//結果:
傳回值的比較
上文說道include有傳回值,而require無傳回值
對於include,如果載入成功,有傳回值,傳回值為1;如果載入失敗,則返回false.
對於require,如果載入成功,有傳回值,傳回值為1;如果載入失敗,無傳回值。
//test1.php<?php$a = include "./test2.php";var_dump($a);echo "<br>";$b = include "./test2.phps";var_dump($b);echo "<br>";$c = require "./test2.php";var_dump($c);echo "<br>";$d = require "./test2.phps";var_dump($d);?>
輸出:
當檔案中有return:
當被載入檔案中有return語句時,會有另外的機制,此時return語句的作用是終止載入過程,即被載入檔案中return語句的後續代碼不再載入。return語句也可以用於被載入檔案載入時返回一個資料。
//test1.php<?php$a = include "./test2.php";echo "<br>";var_dump($a);?>//test2.php//該檔案中有return語句<?php$b = 'test2';echo "被載入的檔案:A 位置";return $b;echo "<br 被載入的檔案: B 位置";?>
結果: