首頁 php教程 php手册 深入理解PHP之require/include顺序 推荐

深入理解PHP之require/include顺序 推荐

Jun 06, 2016 pm 08:35 PM
include require

在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经

也就有了如下的疑问:

include_path是怎么起作用的?

如果有多个include_path顺序是怎么样的?

什么情况下include_path不起作用?

今天, 我就全面的介绍下这个问题, 先从一个例子开始吧.

如下的目录结构:

  • root
  • ├ php
  • └ subdir
  • ├ php
  • 在1.php中:

    复制代码 代码如下:


    ini_set("include_path", ".:path_to_subdir");
    require("2.php");
    ?>


    而在2.php中:

    复制代码 代码如下:


    require("3.php");
    ?>


    而在root目录下的3.php打印出”root”, 在subdir目录下的3.php打印出”subdir”;

    现在, 我的问题来了:
    1. 当在root目录下运行1.php, 会得到什么输出?
    2. 在subdir下运行上一级目录的1.php, 有会得到什么输出?
    3. 当取消include_path中的当前目录path(也就是include_path=”path_to_subdir”), 上面俩个问题又会是什么输出?
    PHP中的include_path
    PHP在遇到require(_once)/include(_once)的指令的时候, 首先会做如下的判断:

    复制代码 代码如下:


    要包含的文件路径是绝对路径么?
    如果是, 则直接包含, 并结束.
    如果不是, 进入另外的逻辑(经过多次调用, 宏展开后进入_php_stream_fopen_with_path)寻找此文件


    接下来, 在_php_stream_fopen_with_path中, 会做如下判断:

    复制代码 代码如下:


    要包含的文件路径是相对路径么(形如./file, ../dir/file, 以下用"目录相对路径代替")?
    如果是, 则跳过include_path的作用逻辑, 直接解析相对路径(随后单独介绍)


    会根据include_path,和当前执行文件的path组成一个待选的目录列表, 比如对于文章前面的例子来说, 会形成一个如下的待选列表

    复制代码 代码如下:


    ".:path_to_subdir:current_script_dir


    然后, 依次从待选列表头部开始, 根据DEFAULT_DIR_SEPARATOR(本文的环境是”:”)取出待选列表中的一个路径, 然后把要包含的文件名附加在这个路径后面, 进行尝试. 如果成功包含, 则返回, 否则继续下一个待选路径.
    到现在为止, 我们已经可以回答我开头提出的3个问题了.
    1. 因为在root目录下执行, 所以在1.php中包含2.php的时候, include_path的第二个待选路径起了作用(path_to_subdir), 找到了path_to_subdir/2.php, 而在2.php包含3.php的时候, 当前工作目录是root下, 所以在包含3.php的时候, include_path的第一个待选路径”.”(当前工作目录)下就找到的匹配的文件, 所以得到的输出是”root”.
    2. 同1, 只不过当前的路径是subdir, 所以得到的输出是”subdir”.
    3. 因为没有了当前路径为include_path, 所以在root目录下运行的时候2.php中包含3.php的时候, 是path_to_subdir起了作用, 所以无论在root还是subdir都将得到”subdir”的输出.
    而如果在2.php中清空include_path,

    复制代码 代码如下:


    ini_set("include_path", '');
    require("3.php");
    ?>


    那么将会是current_script_dir起作用, 而这个时候current_script_dir是2.php的路径, 所以还是会得到”subdir”的输出.
    目录相对路径
    在使用目录相对路径的情况下, 相对路径的基点, 永远都是当前工作目录.
    为了说明在目录相对路径下的情况,我们再看个列子, 还是上面的目录结构, 只不过1.php变成了:

    复制代码 代码如下:


    ini_set("include_path", "/");
    require("./subdir/2.php");
    ?>


    2.php变成了:

    复制代码 代码如下:


    require("./3.php");
    ?>


    如果在root目录下执行, 2.php中寻找3.php将会在当前目录的相对路径下寻找, 所以得到的输出是”root”, 而如果是在subdir下执行上一级目录的1.php(php -f ../1.php), 将会因为在subdir下找不到”./subdir/2.php”而异常退出.
    后记
    1. 因为使用include_path和相对路径的情况下, 性能会和寻找的次数有关, 最坏的情况下, 如果你有10个include_path, 那么最多可能会重试11次才能找到要包含的文件, 所以, 在能使用绝对路径的情况下最好使用绝对路径.
    2. 因为目录相对路径的basedir, 永远都是当前工作路径, 如果要使用, 需要和实际部署路径相关, 所以实际使用的很少(当然, 也有借助chdir来完成的模块).
    3. 在模块化的系统设计中, 一般应该在模块内, 通过获取模块的部署路径(dirname(__FILE__), php5.3以后更是提供了__DIR__常量)从而使用绝对路径. ,香港服务器租用,香港服务器,服务器空间
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    vue3+vite:src使用require動態匯入圖片報錯怎麼解決 vue3+vite:src使用require動態匯入圖片報錯怎麼解決 May 21, 2023 pm 03:16 PM

    vue3+vite:src使用require動態導入圖片報錯和解決方法vue3+vite動態的導入多張圖片vue3如果使用的是typescript開發,就會出現require引入圖片報錯,requireisnotdefined不能像使用vue2這樣imgUrl:require(' …/assets/test.png')導入,是因為typescript不支援require所以用import導入,下面介紹如何解決:使用awaitimport

    php include和include_once有什麼差別 php include和include_once有什麼差別 Mar 22, 2023 am 10:38 AM

    當我們在使用 PHP 編寫網頁時,有時我們需要在目前 PHP 檔案中包含其他 PHP 檔案中的程式碼。這時,就可以使用 include 或 include_once 函數來實作檔案包含。那麼,include 和 include_once 到底有什麼差別呢?

    require的用法有哪些 require的用法有哪些 Nov 27, 2023 am 10:03 AM

    require用法:1、引入模組:在許多程式語言中,require用於引入外部模組或庫,以便在程式中使用它們提供的功能。例如,在Ruby中,可以使用require來載入第三方函式庫或模組;2、導入類別或方法:在一些程式語言中,require用來匯入特定的類別或方法,以便在目前檔案中使用它們;3、執行特定任務:在一些程式語言或框架中,require用於執行特定的任務或功能。

    PHP中require關鍵字的作用與使用方式詳解 PHP中require關鍵字的作用與使用方式詳解 Jun 28, 2023 pm 11:31 PM

    PHP中require關鍵字的作用與使用方法詳解在PHP開發中,require是非常常用的關鍵字。它的作用是將指定的檔案包含進來,以供目前腳本使用。本文將詳細講解require關鍵字的作用與使用方法。一、require關鍵字的作用require關鍵字可以將一個檔案的內容包含到目前腳本中。它通常用於包含一些必要的外部文件,例如庫文件、配置文件等。使用req

    解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php' (include_path='.;C:\php\pear')的步驟 解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php' (include_path='.;C:\php\pear')的步驟 Nov 27, 2023 pm 12:51 PM

    解決PHP標題中的fatalerror:require():Failedopeningrequired'data/tdk.php'(include_path='.;C:phppear')的步驟在使用PHP開發網站或應用程式時,我們經常會遇到各種錯誤。其中一個常見的錯誤是"fatalerror:require():Failed

    解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php'的步驟 解決php標題中的fatal error: require(): Failed opening required 'data/tdk.php'的步驟 Nov 27, 2023 am 10:41 AM

    解決PHP標題中的FatalError:require():Failedopeningrequired'data/tdk.php'的步驟在開發和維護PHP網站時,我們經常會遇到各種錯誤和異常。其中一個常見的錯誤是"FatalError:require():Failedopeningrequired'data/tdk.php'"。

    PHP檔:// PHP檔:// Aug 20, 2023 pm 06:13 PM

    介紹在PHP中,可以使用各種URL樣式的協定與檔案系統函數配合使用,借助對應的內建包裝器。也可以使用stream_wrapper_register()函數來定義自訂包裝器。 PHP中的預設包裝器是 file://,它表示本機檔案系統。如果沒有明確使用其他協議,PHP解析器會將其視為檔案系統包裝器。傳給檔案系統函數fopen(), file_get_contents()等的檔案名稱參數預設使用file://協定。當檔案名稱不以正斜線、反斜線或Windows中的驅動

    如何在一個php.ini檔案中包含另一個php.ini檔案? 如何在一個php.ini檔案中包含另一個php.ini檔案? Sep 02, 2023 pm 03:45 PM

    無法包含主php,ini檔案中的.ini檔案。相反,在編譯PHP時,該行--with-config-file-scan-dir=PATH                  &a

    See all articles