1. ホーム
  2. php

[解決済み] なぜ include や include_once 文で dirname(__FILE__) を使うのでしょうか?

2022-03-02 16:45:15

質問

こんなの見たことある。

<?php
  include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php');
?>

なぜ、こんなことをする必要があるのでしょうか? なぜわざわざdirnameを取得して、それをディレクトリセパレータで連結し、新しいファイル名にしなければならないのでしょうか?

上のコードはこれと同等ではないのでしょうか。

<?php
  include( 'my_file.php' );
?>

??

PHPのドキュメント と書かれています。

ファイルは、与えられたファイルパス、または何も与えられない場合は、指定されたinclude_pathに基づいてインクルードされます。もしファイルがinclude_pathで見つからなかった場合、以下のようになります。 include() は最終的に、呼び出したスクリプト自身のディレクトリをチェックします。 と現在の作業ディレクトリを指定してから失敗します。ファイルが見つからない場合、include() 構文は警告を発します。これは、致命的なエラーを発する require() とは異なる動作です。

どのように解決するのですか?

例えば、次のような(偽の)ディレクトリ構造を持っているとします。

.../root/
        /app
            bootstrap.php
        /scripts
            something/
                somescript.php
        /public
            index.php

ここで、次のように仮定します。 bootstrap.php には、データベース接続を設定するためのコードや、その他のブーストラッピングのようなものが含まれています。

にファイルをインクルードしたいと仮定します。 boostrap.php というフォルダに init.php . では、インクルードパス全体をスキャンするのを避けるために include 'init.php' を使用することができます。 include './init.php' .

でも、問題がありますね。その ./ を含むスクリプトからの相対パスとなります。 bootstrap.php ではなく bootstrap.php . (技術的に言えば、作業ディレクトリからの相対パスとなります)。

dirname(__FILE__) が存在するディレクトリが作業ディレクトリであることに依存せずに、絶対パスを取得することができます (したがって、インクルードパスの検索を避けることができます)。 bootstrap.php が存在します。

(注意:PHP5.3以降では __DIR__ の代わりに dirname(__FILE__) .)

さて、なぜincludeを使わないかというと 'init.php'; ?

最初と同じくらい奇妙なことですが。 . は、インクルードパスに含まれることが保証されていません。 時には、無駄な stat() は、同じディレクトリにインクルードファイルがほとんどない場合、インクルードパスから削除されます (インクルードがそこにないことが分かっているのに、なぜカレントディレクトリを検索するのでしょうか?)。

注:この回答の約半分は、かなり古い投稿に記載されています。 require('myParent.php')よりもrequire(dirname(__FILE__).'/'. 'myParent.php') の方が良いのでしょうか?