這一篇博客主要講文件加載的四種形式(
include,include_once,require,require_once
)
1. 綜述
有四種文件加載的形式(不是函數)
- include
- include_once
- require
- require_once
它們的本質是一樣的都是用於加載/引入/包含/載入一個外部文件到當前php代碼中來。
他們只在2個方面有細微區別:
- xxx_once 和xxx的區別:前者能夠保證不會被重複加載
- require 和 include的區別:如果被包含文件不存在,即引用失敗(出錯)時,include發出警告並繼續執行後續代碼,require直接終止。
它們都是語法結構,而非函數,使用形式可以有兩種:
- include ‘文件路徑’;
- include(‘文件路徑’)
2. 文件路徑問題
2.1 相對路徑
就是以”./”,或”../”,開頭的路徑
- ./ 表示當前網頁文件的所在位置(文件夾,目錄);
- ../ 表示當前網頁文件的所在位置的上一級位置(文件夾,目錄)
這種相對位置對一個網站中的所有內容(包括php,html,圖片,css,js文件)都有效
2.2 絕對路徑
- 本地絕對路徑:
- window系統: c:/d1/d2/page3.php
- unix系列系統: /d1/d2/page3.php
- 網絡絕對路徑: http://www.abc.com/d1/d2/page4.php
2.3 只有文件名(無路徑)
在php的include語法(其他3個也一樣)中,如果只給出文件名,而沒有給出路徑,則此時有其內部找到該文件的規則,如下:
2.3.1. 首先在系統設置的include目錄中查找:
在php.ini配置文件中,有:include_path設定:
;windows:"\path1;\path2"
;include_path = ".;C:\php\includes"
可見默認無設定;該設定其實可以設定多個目錄,其間用分號分開,系統會按順序依次查找要載入的文件。修改php.ini中的include_path爲
;windows:"\path1;\path2"
;include_path = ". ;C:\php\includes; C:\users\chang\test"
我們也可以在腳本中設定:
<?php
//設定配置文件中的include_path的值,代碼中的設定只對當前代碼有效
//而且這裏的設定無需重啓apache
set_include_path('C:\users\chang\test')
//更常見的做法
$path = get_include_path();//先獲取系統的include_path值
$path_new = $path . PATH_SEPARATER . "C:\users\chang\test";
//PATH_SEPARATER:是系統常量,代表目錄分隔符
//unix系列:":"
//windows系列:";"
set_include_path($path_new);//這樣不會丟失原有的路徑設置
2.3.2 上面沒找到,在當前執行的網頁文件所在目錄(所謂當前工作目錄)查找:
所謂當前網頁文件,就是地址欄中顯示的那個文件名。
2.3.3 上面還沒找到,則在當前include命令所在文件的所在目錄中查找:
如果一個文件(A)包含文件B,在文件B中又有include命令包含文件C,
此時B中的路徑問題就可能發生這種情況。
3. 文件載入執行流程
- 從include語句處退出php腳本模式(進入html代碼模式)
- 載入include語句所設定的文件中的代碼,並執行之(如同在當前文件中一樣)
- 退出html模式重新進入php腳本模式,繼續之後的代碼
4. return關鍵字
return 關鍵字的一般作用
- return; //單純結束
- return
x;//結束,並返回數據 x
- return
那麼,被包含(載入)的文件中的return關鍵字也具有同樣作用
main.php
<?php
echo "main中第一行";
include 'page1.php';
echo "main中第二行";
$n = include 'page2.php';//將page4執行結果返回給$n
echo "主文件中n=$n"
page1.php
<?php
echo "page1中第一行";
echo "page1中第二行";
return;
echo "page1中第三行";
page2.php
<?php
$m = 10;
echo "page2中第一行";
echo "page2中第二行";
return $m;
echo "page2中第三行";