PHP require/include顺序详解
在大型的web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经常会让我们遇到一些因为没有找到正确的文件而导致的看似"诡异"的问题.也就有了如下的疑问:include_path是怎么起作用的?如果有多个include_path顺序是怎么样的?什么情况下include_path不起作用?
今天, 我就全面的介绍下这个问题, 先从一个例子开始吧.如下的目录结构:
1.php 2.php 3.php
3.php在1.php中:
<?php ini_set("include_path", ".:path_to_subdir"); require("2.php"); ?>
而在2.php中:
<?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:
<?php ini_set("include_path", ''); require("3.php"); ?>
那么将会是current_script_dir起作用, 而这个时候current_script_dir是2.php的路径, 所以还是会得到"subdir"的输出.
目录相对路径:在使用目录相对路径的情况下, 相对路径的基点, 永远都是当前工作目录,为了说明在目录相对路径下的情况,我们再看个列子, 还是上面的目录结构, 只不过1.php变成了:
<?php ini_set("include_path", "/"); require("./subdir/2.php"); ?>
2.php变成了:
<?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__常量)从而使用绝对路径.
文章地址:
转载随意^^请带上本文地址!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











vue3+vite:src は、イメージとエラー レポートと解決策を動的にインポートするために require を使用します。vue3+vite は複数のイメージを動的にインポートします。vue3。TypeScript 開発を使用している場合、イメージを導入するために require のエラー メッセージが表示されます。requireisnotdefined は使用できません。 vue2 のような imgUrl:require(' .../assets/test.png') は、typescript が require をサポートしていないため、インポートされます。そのため、import が使用されます。解決方法は次のとおりです: awaitimport を使用します

PHP を使用して Web ページを作成する場合、他の PHP ファイルのコードを現在の PHP ファイルに含める必要がある場合があります。現時点では、include 関数または include_once 関数を使用してファイルのインクルードを実装できます。では、include と include_once の違いは何でしょうか?

require の使用法: 1. モジュールの導入: 多くのプログラミング言語では、require は外部モジュールまたはライブラリを導入し、それらが提供する関数をプログラム内で使用できるようにするために使用されます。たとえば、Ruby では、require を使用してサードパーティのライブラリまたはモジュールをロードできます。 2. クラスまたはメソッドのインポート: 一部のプログラミング言語では、require を使用して特定のクラスまたはメソッドをインポートし、現在のファイルで使用できるようにします。 ; 3. 特定のタスクを実行する: 一部のプログラミング言語またはフレームワークでは、特定のタスクまたは関数を実行するために require が使用されます。

PHP ヘッダーの Fatalerror:require():Failedopeningrequired'data/tdk.php'(include_path='.;C:phppear') を解決する手順 PHP を使用して Web サイトやアプリケーションを開発する場合、さまざまなエラーが発生することがよくあります。一般的なエラーの 1 つは、「fatalerror:require():Failed」です。

ここでは、さまざまなスレッドを使用して数値を正しい順序で出力する方法を見ていきます。ここでは、n 個のスレッドを作成し、それらを同期します。最初のスレッドが 1 を出力し、次に 2 番目のスレッドが 2 を出力する、という考え方です。 1 つのスレッドが印刷しようとすると、リソースがロックされ、他のスレッドがその部分を使用できなくなります。例 #include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<unistd.h>pthread_mutex_tmutex=PTHREAD_MUTEX_I

PHPにおけるrequireキーワードの役割と使い方を詳しく解説 PHP開発において、requireは非常によく使われるキーワードです。その機能は、現在のスクリプトで使用するために指定されたファイルをインクルードすることです。この記事ではrequireキーワードの機能と使い方を詳しく解説します。 1. require キーワードの役割 require キーワードは、ファイルの内容を現在のスクリプトに含めることができます。通常、ライブラリ ファイル、設定ファイルなどの必要な外部ファイルを含めるために使用されます。要求を使用する

PHP ヘッダーの FatalError:require():Failedopeningrequired'data/tdk.php' を解決する手順 PHP Web サイトを開発および保守するときに、さまざまなエラーや例外が頻繁に発生します。一般的なエラーの 1 つは、「FatalError:require():Failedopeningrequired'data/tdk.php'」です。

CSS3 セレクターの優先順位 CSS では、セレクターの優先順位によって、要素に適用されるルールが決まります。複数のルールが同じ優先度を持つ場合、それらは出現する順序で適用されます。異なる優先順位を持つルールの場合、CSS は特定のアルゴリズムを使用して、どのルールが最終的に適用されるかを決定します。以下では、CSS3 におけるセレクターの優先順位を紹介し、具体的なコード例を示します。 CSS では、セレクターの優先順位は次の要素によって決まります。 インライン スタイル シート (Inlinestyles): Inline
