PHP での require_once の使用法と相対ディレクトリについては注意してください

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

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 ファイルの内容を見てみましょう:

<?php
     require_once("folder_a/file_a_a.php");
     echo "文件folder_a_a.php被包含成功";
?>
ログイン後にコピー

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

<?php
     require_once("../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>
ログイン後にコピー

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

<?php
     class X{
          function printInfo(){
               echo &#39;success;
          }
     }
?>
ログイン後にコピー

Yiju チュートリアル ネットワーク >Php チュートリアル>>FAQ >

php require_once の使用法と相対ディレクトリは注意して使用する必要があります

www.111cn.net 更新: 2012-06-25編集者: xiewen 出典: 転載

記事の紹介 この記事では、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 "The filefolder_a_a.php was added completed";

?>

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

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

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

$x = new X() ;

$x.printInfo();

? >

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

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

class X{

function printInfo(){

echo 'success;

理由

インクルードファイル

: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 require_once('../folder_b/file_b_a.php で file_a_a を実行することと同等です) '); in .php は、index.php の現在の場所に基づいてこのパス ファイル (file_b_a.php) を探します。絶対パスですが、なぜ問題が起こらないのでしょうか? おそらく、この文については少し混乱していると思います (プログラムの実行順序に従って)

プログラムは最初に .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 のこの場所にコピーします:

その後、実行が続行されます: これは、php 内のすべてのコードを実行します。では、どのコードが実行されるのか見てみましょう

<?php
     require_once(dirname(FILE).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>
ログイン後にコピー

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

<?php
     require_once(dirname(FILE).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
     echo "文件folder_a_a.php被包含成功";
?>
ログイン後にコピー

我们来看个注意事项

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

c.php
require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class A
{
}
ログイン後にコピー

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
ログイン後にコピー

执行localhost/c.php 系统报错,报错信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?
原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();
ログイン後にコピー

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错。
所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。


require_once很简单用但在使用时大家尽量使用绝对路径了。

以上がPHP での require_once の使用法と相対ディレクトリについては注意してくださいの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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