ホームページ >バックエンド開発 >PHPチュートリアル >php require_once の使用法と相対ディレクトリに注意する_PHP チュートリアル

php require_once の使用法と相対ディレクトリに注意する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:56:051722ブラウズ

この記事では、PHP 開発でよく遭遇する require_once の使用法を紹介しています。必要な方は参考にしてください。

wwwroot //Web サイトのルート ディレクトリの絶対パスは次のとおりです: F:/wwwroot

--folder_a // フォルダー A

file_a_a.php

file_a_b.php

file_a_c.php

--folder_b // フォルダー B

file_b_a.php

file_b_b.php

file_b_c.php

--index.php

************************************************ ***** *************

このディレクトリ階層はすでに非常に明確です:

wwwroot はルート ディレクトリであり、その下にindex.php ファイルと 2 つのフォルダー (folder_a とfolder_b) があります

これら 2 つのフォルダーにはそれぞれ 3 つの php ファイルがあります

まず、index.php ファイルの内容を見てみましょう:

コードは次のとおりです コードをコピー

require_once("folder_a/file_a_a.php");

echo "ファイルfolder_a_a.phpは正常にインクルードされました";

?>

folder_a/folder_a_a.php ファイルの内容を見てみましょう:

コードは次のとおりです コードをコピー

require_once("../folder_b/file_b_a.php");

$x = 新しい X();

$x.printInfo();

?>

最後に、folder_b/folder_b_a.php ファイルの内容を見てみましょう:

今すぐ floder_a/file_a_a.php を直接実行すればOKです

その後、「success」が出力されます

wwwroot でindex.phpを実行した場合

その後、インクルードされたファイルが見つからないため、エラーが報告されます: file_b_a.php

しかし、 dirname(__FILE__).'/' をすべての require_once() に追加すると

その後、file_a_a.php またはindex.php を実行しても、出力は正常になります

************************************************ ***** **********

質問:

初めて相対パスを使用したため、繰り返しインクルードするとエラーが発生しました

2回目は絶対パスを使用したので、エラーはありませんでしたが、まだ少し混乱しています:

私はまず、相対パス使用時のエラーの理由を次のように分析しました:

index.php を実行すると、folder_a ディレクトリとそのディレクトリ内の file_a_a.php が見つかるので、folder_a/file_a_a.php の内容を Index.php の最初の行 (ステートメント行を含む行) にコピーします。その後、実行を継続します (つまり、含まれているコンテンツを実行します)。したがって、これは、index.php の file_a_a.php で require_once('../folder_b/file_b_a.php') を実行するのと同じです。これは、現在のパスの検索に基づいています。 Index.phpの場所にあるファイル(file_b_a.php)を探しましたが、当然見つからないので失敗しました

でも、絶対パスを使用した場合も同じではないでしょうか? でも、なぜ間違っていないのでしょうか? おそらく皆さんはこの文について少し混乱しているので、(プログラムの実行順序に従って) 詳しく説明しましょう。

プログラムは最初にindex.phpを実行します(この時点でdirname(__FILE__)を追加したため、現在のパスは絶対パスであることに注意してください)。

index.php は最初にコードの最初の行を実行します: require_once(dirname(__FILE__).'/'.'folder_a/file_a_a.php');

dirname(__FILE__) は f:/wwwroot/ であるため、このコードに含まれるパスは次のとおりです:

f:/wwwroot/folder_a/file_a_a.php

このパスは正しいので問題ありませんね

OK、最初のステップは正しく完了しました

次に、file_a_a.php のコードをindex.php のこの場所にコピーします:

その後、実行が続行されます。これは、index.php 内の file_a_a.php 内のすべてのコードを実行するため、どのようなコードが実行されるか見てみましょう。

コードは次のとおりです コードをコピー

クラスX{

関数 printInfo(){

️ echo 'success;

}

}

?>

コードは次のとおりですコードをコピー

require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php");

$x = 新しい X();

$x.printInfo();

?>

これらのコードはindex.phpにコピーされていることに注意してください。つまり、index.phpの内容は実際には次のようになります:

コードは次のとおりですコードをコピー

require_once(dirname(__FILE__).'/'."../folder_b/file_b_a.php");

$x = 新しい X();

$x.printInfo();

echo "ファイルfolder_a_a.phpは正常にインクルードされました";

?>

注意点を見てみましょう

次の 3 つのファイル c.php a.php b.php があり、対応するストレージ ディレクトリが localhost/localhost/localhost/demo であるとします。

コードは次のとおりですc.php

b.phpの内容はCLASS Aを継承しているのでさらに興味深いので、a.phpも導入してみました

コードをコピー

require_once("a.php");

require_once("demo/b.php");

B::demo();a.php
クラスA
{
}

コードは次のとおりです コードをコピー

require_once("../a.php");
クラス B は A を拡張します
{
パブリック静的関数demo()
{
エコー「xx」;
}
}

localhost/c.php を実行すると、システムは次のようなエラーを報告します
。 警告: require_once(../a.php) [function.require-once]: ストリームを開けませんでした: F:wwwdemob.php の 2 行目にそのようなファイルまたはディレクトリはありません
致命的なエラー: require_once() [function.require]: F:wwwdemob.php の 2 行目で、必要な '../a.php' (include_path='.;C:php5pear') を開くことができませんでした。 b.php の require_once ステートメントを削除すると、正常に実行されるので、定義された require_once ステートメントが多すぎるのでしょうか。理由は、クラス A が 2 回再定義されたためですか?しかし、そうではありません。 c.php に require_once(‘a.php’); を追加するだけなら、2 回書いても正しくなります。
その理由は、b.php で定義されたディレクトリ レベルが c.php 実行ファイルのディレクトリ レベルと一致せず、その結果、c.php に 2 つの require_once ステートメントが発生するためです。

と同等にする
コードは次のとおりです コードをコピー

require_once("a.php");
require_once("../a.php");
クラス B は A を拡張します
{
パブリック静的関数デモ()
{
エコー「xx」;
}
}
B::デモ();

原因が判明しました。c.phpでは相対ディレクトリ「..」がc.phpの上層にあるため、ファイルが見つからない場合にエラーが発生するためです。
したがって、PHP で require_once を使用する場合、異なる階層関係が存在するため、相対ディレクトリの使用には注意が必要であるという結論になります。


require_once の使用は非常に簡単ですが、使用する場合は絶対パスを使用するようにしてください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632204.html技術記事 PHP開発でよく遭遇するrequire_onceの使い方を紹介していますので、困っている方は参考にしてください。 wwwroot //ウェブサイトのルート ディレクトリ、絶対パスは次のとおりです: F:/wwwroot --...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。