PHP中引入文件的四種方式詳解


四種語句

PHP中有四個加載文件的語句:include、require、include_once、require_once

 

 

基本語法

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
<?php
include './tsest.php';
echo 'this is test1';
?>

//test2.php
<?php
echo 'this is test2\n';
function test() {
    echo 'this is test\n';
}
?>

//結果:
this is test1

    require在加載失敗時會生成一個致命錯誤(E_COMPILE_ERROR),在錯誤發生后腳本停止執行。一般用在后續代碼依賴於載入的文件的時候。

//test1.php
<?php
require './tsest.php';
echo 'this is test1';
?>

//test2.php
<?php
echo 'this is test2\n';
function test() {
    echo 'this is test\n';
}
?>

結果:

 

include和include_once:

    include載入的文件不會判斷是否重復,只要有include語句,就會載入一次(即使可能出現重復載入)。而include_once載入文件時會有內部判斷機制判斷前面代碼是否已經載入過。這里需要注意的是include_once是根據前面有無引入相同路徑的文件為判斷的,而不是根據文件中的內容(即兩個待引入的文件內容相同,使用include_once還是會引入兩個)。

//test1.php
<?php
include './test2.php';
echo 'this is test1';
include './test2.php';
?>

//test2.php
<?php
echo 'this is test2';
?>

//結果:
this is test2this is test1this is test2


//test1.php
<?php
include './test2.php';
echo 'this is test1';
include_once './test2.php';
?>

//test2.php
<?php
echo 'this is test2';
?>

//結果:
this is test2this is test1


//test1.php
<?php
include_once './test2.php';
echo 'this is test1';
include './test2.php';
?>

//test2.php
<?php
echo 'this is test2';
?>

//結果:
this is test2this is test1this is test2


//test1.php
<?php
include_once './test2.php';
echo 'this is test1';
include_once './test2.php';
?>

//test2.php
<?php
echo '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
<?php
echo "<br> 被載入文件位置 2";
?>
<br> 被載入文件位置 3

結果:

分析:

 

 

加載時的路徑問題

相對路徑:

相對於當前網頁文件所在位置來定位某個被加載的文件位置。

./  表示表示當前位置,即當前網頁文件所在的目錄
. . /  表示上一級位置,即當前網頁文件所在目錄的上一級目錄

 

//例如:
include "./test2.php";
require "../../test3.html";
 
        

絕對路徑:

分為本地絕對路徑和網絡絕對路徑

 本地絕對路徑:

從本地的根目錄逐層遞歸向下找,直到找到對應目錄下的待引入文件。

include "C:/PHP/test/test2.php";

我們都知道,絕對路徑不利於項目的移植和可維護性,所以一般很少在代碼中直接這樣寫絕對路徑,但是如果我們需要用到絕對路徑,應該怎么辦??PHP中有魔術常量__DIR__和全局數組$_SERVER,用法如下:

<?php
define('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.php
include "./test2.php";
//結果:this is test2


//test1.php
include "./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 位置";
?>

結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM