PHP で include(require) を使用してインクルード ファイルをネストするときに注意する必要がある問題

黄舟
リリース: 2023-03-11 11:46:01
オリジナル
1714 人が閲覧しました

/** 
* Author:RDP 
* My mail:abel1314520@gmail.com 
* My blog:  http://blog.teamhaka.com
 */
ログイン後にコピー


注: 次の手順は、includeinclude_oncerequirerequire_onceに適用されます。

この例は、基本的に、a.php には b.php が含まれ、b.php には c.php が含まれるなど、ネストされた包含形式です。主な議論は、a.php と c.php の構造的な関係です。このうち、a.php がエントリーファイルです。

ファイルを含める場合、実際にはパスには 3 つのオプションがあります

はそれぞれ

1 つの絶対パス

(カレントディレクトリ ./は使用しないでください) 例: ccc/c.php 2つの相対パスについて, 上記の(2)と(3)の相対パスの違いに直感的に注目することができます。 ./ の有無は、インクルード ファイルをネストするときに大きな違いをもたらします。詳細は後述します。

絶対パスを使用する際の注意点:

絶対パスを直接記述する場合は特に注意する必要はありませんが、dirname(FILE)を使用して現在のファイルの絶対パスを取得する場合は注意してください。
これを書くかどうか このステートメントのphpファイルが他のファイルに含まれているかどうか、dirname(FILE)は常にこのステートメントが書かれているphpファイルの絶対パスを指します

例: エントリーファイルとして

a.php: require './b/b.php';

b.php: require dirname(FILE).'/c.php'; その後、a.php を実行すると、b.php のディレクトリ名 (FILE) は、a.php が配置されている絶対パスではなく、b.php が配置されている絶対パスを取得します。 (この例では、b.php と c.php が同じディレクトリ b に属していることを意味します)

🎜 🎜🎜🎜2 相対パスの使用に関する注意事項 (現在のディレクトリは ./ を使用します): 🎜🎜

相対パスは特定のディレクトリに基づいて、含める必要があるファイルの場所を決定します。 相対パスのベースディレクトリは、ネストのレベルに関係なく、プログラム実行用のエントリファイルが配置されているディレクトリです。

例: エントリーファイルとしての

a.php: require './b/b.php';

b.php: require './c/c.php';ここで c ディレクトリを含める場合は ./ が使用されることに注意してください。そして、ここで c.php が配置されている c ディレクトリは b ディレクトリの下にあるのではなく、b ディレクトリと同じレベルにあることに注意してください。 b.php へのインクルードには相対パスが使用され、プログラム エントリは a.php であるため、b.php のインクルードに使用される相対パスは、エントリ ファイル a.php が配置されているディレクトリに基づく必要があります。

相対パスを使用する場合の 3 つの注意点 (カレント ディレクトリは ./ を使用しません):

は 2 つのステップで処理されます。まず、プログラム エントリ ファイルが存在するディレクトリに基づいて相対パスに沿って検索します。既存のファイルが見つかった場合は、Exit success を含めます (上記の [相対パス (現在のディレクトリには ./ を使用)] と同じです)。見つからない場合は、2 番目のステップに進みます。つまり、require文が記述されているPHPファイルが存在するディレクトリをrequireに含まれるパスで結合するか、エントリファイルが存在するディレクトリを基に、この結合によって得られる相対パスに沿って検索します。ファイルが存在する場合は、正常にインクルードされます。それ以外の場合は、インクルードされるファイルが存在しないことを意味します。例を見ると理解しやすいです。

例: エントリーファイルとしての

a.php: require './b/b.php'; b.php: require 'c/c.php'; c ディレクトリが使用されていない場合、 ./ すると、まずエントリーファイル a.php が存在するディレクトリ内で c/c.php が検索され、それがあればインクルードは成功です。

見つからない場合は、b.php のパス (./b/b.php) と b.php の require のパス (c/c.php) を結合して、結合された相対パスを取得します。 /b/c/c.php.エントリ ファイル a.php が存在するディレクトリで ./b/c/c.php を検索します。存在する場合は成功を意味します。存在しない場合はエラーが発生します。

/*******************分割線***********************/

相対パスのネストされた包含について簡単にまとめてみましょう。

相対パスのネストされたインクルードでは、プログラム エントリ ファイルが配置されているディレクトリをベースとして使用し、相対パスに沿ってインクルードする必要があるファイルを検索します。

しかし、カレントディレクトリの概念が相対パスで使用される場合は、違いが生じます。つまり、カレントディレクトリを表すために ./ を使用しない場合でも、処理は異なります。

有./就是以入口文件所在目录为基准来直接搜寻,

没有./,则先以入口文件所在目录为基准来搜寻,找不到的情况下做路径的拼接处理,然后按拼接后的相对路径来搜寻,基准依然是入口文件所在目录。

综合下使用./和不使用./的一个例子

文件结构如下:

/WEBROOT

——–test.php

——–/folder2/test2.php

——–/folder2/folder3/test3.php

作为程序入口的test.php包含test2.php,而test2.php中包含了test3.php。

那么在test2.php中的包含路径的写法有如下差异:

require ('folder2/folder3/test3.php'); //正确! 直接在入口程test.php所在的WEBROOT目录下搜寻folder2/folder3/test3.php  
参考上述的【三 使用相对路径(当前目录不使用./)的注意点】
ログイン後にコピー


require ('folder3/test3.php');  //正确! 拼接相对路径然后搜寻  参考上述的【三 使用相对路径(当前目录不使用./)的注意点】
ログイン後にコピー


  1. require
     (
    './folder2/folder3/test3.php'
    );  
    //正确!  参考上述的【二 使用相对路径(当前目录使用./)的注意点】
    ログイン後にコピー


  1. require
     (
    './test3/test3.php'
    );    
    //错误!入口程序test.php所在的WEBROOT目录下并不存在test3这个目录!参考上述的【二 使用相对路径(当前目录使用./)的注意点】
    ログイン後にコピー

    以上がPHP で include(require) を使用してインクルード ファイルをネストするときに注意する必要がある問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!