ホームページ  >  記事  >  バックエンド開発  >  PHPのrequire命令とinclude命令の詳しい説明

PHPのrequire命令とinclude命令の詳しい説明

黄舟
黄舟オリジナル
2017-06-25 10:55:071183ブラウズ

大規模な Web プロジェクトでは、include_path が モジュール性 設計の基礎となります (もちろん、自動ロードに基づいた設計も数多くありますが、これはこの記事の説明に影響しません)。しかし、まさに include_path があるためです。 、多くの場合、これにより、正しいファイルが見つからないことが原因で、一見「奇妙な」問題が発生することがあります。

次の疑問も生じます:

include_path はどのように機能しますか?

複数ある場合、その順序は何ですか? include_path?

どのような状況で include_path が機能しないのでしょうか?

今日は、例から始めてこの問題を包括的に紹介します。

以下のディレクトリ構造:

  root    
  ├ 1.php    
  ├ 3.php    
  └ subdir         
  ├ 2.php          
  └ 3.php

1.php 内:

コード

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


そして 2.php では:

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

そして、ルート ディレクトリの 3.php は "root" を出力し、サブディレクトリの 3.php は "root" "subdir" を出力します。

さて、ここで私の質問が来ます:
1. ルートディレクトリで 1.php を実行すると、どのような出力が得られますか?
2. サブディレクトリの下の上位ディレクトリで 1.php を実行すると、どのような出力が得られますか?
3. include_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/ の形式) かどうかファイルの場合は、以下の「ディレクトリ相対パス」を使用してください)?
その場合は、include_path のロジックをスキップして、相対パスを直接解析します (後ほど個別に説明します)


は、include_path と現在の実行ファイルに基づいて作成されます。例えば、前回の記事の例の場合、次のように候補リストが作成されます

コードは次のとおりです。

".:path_to_subdir:current_script_dir

そうすると、候補リストの先頭から順に、 DEFAULT_DIR_SEPARATOR(この記事の環境は「:」) 候補リストからパスを取り出し、そのパスに含めるファイル名を追加して試し、成功した場合は戻り、そうでない場合は次の候補を続行します。
ここまでで、最初に挙げた 3 つの質問に答えることができます。 1. ルート ディレクトリで実行されるため、include_path の 2 番目の候補のパスが再生されます。 role.(path_to_subdir)、path_to_subdir/2.php が見つかり、2.php に 3.php が含まれる場合、現在の作業ディレクトリは root の下にあるため、3.php が含まれる場合、include_path が最初のパス候補になります。" "(現在の作業ディレクトリ) なので、出力は "root" になります。
2. 現在のパスが subdir であるため、出力は "subdir" になります。 2.php が 3.php にインクルードされるのは、ルート ディレクトリで実行する場合、path_to_subdir が役割を果たすため、ルートでもサブディレクトリでも、「subdir」の出力が得られます。
そして、2.php の include_path をクリアすると、

<?php 
ini_set("include_path", &#39;&#39;); 
require("3.php"); 
?>

すると、current_script_dir が有効になり、この時点では current_script_dir は 2.php のパスなので、ディレクトリ相対パスを使用する場合は、引き続き "subdir" の出力が得られます。相対パスの基点は常に現在の作業ディレクトリです。

ディレクトリ相対パスの状況を説明するために、別の例を見てみましょう。ただし、1.php は次のようになります。 .php は:

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

ルートディレクトリで実行した場合、2.php の 3.php を検索するとカレントディレクトリの相対パスで検索されるため、得られる出力は「root」となり、1 を実行するとサブディレクトリ配下の.php (php -f ../1.php) を実行すると、サブディレクトリ配下に「./subdir/2.php」が見つからないため例外が発生します。 include_path と相対パスを使用する場合、パフォーマンスは検索回数に関係します。include_path が 10 個ある場合、インクルードされるファイルを見つけるまでに最大 11 回再試行する必要がある可能性があります。絶対パスが使用できる場合は、絶対パスを使用するのが最善です。
2. ディレクトリの相対パスの basedir は常に現在の作業パスであるため、それを使用したい場合は、実際のデプロイメント パスに関連付ける必要があります。実際にはほとんど使用されません (もちろん、chdir を使用するモジュールもあります)。モジュラー システム設計では、通常、モジュールのデプロイメント パス (
dirname
(FILE) を取得する) 内に配置する必要があります。 )、php5.3 以降では、DIR 定数が提供されます) で絶対パスを使用します。

以上がPHPのrequire命令とinclude命令の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。