##結論
require_once __DIR__.'/foo/A.php';
これが一番てっとり早くて、設定による差異もなさそう。
そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(__FILE__) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
ディレクトリ構成
/src/をドキュメントルートに指定している想定
src/
foo/
A.php
B.php
index.php
相対パスでの指定
require_once 'B.php';
require_once 'foo/A.php';
相対パスでもindex.phpからA.phpを読み込むことは可能ですが、
A.phpで同じく相対パスを使ってB.phpを読み込んでいた場合エラーになります。
相対パスで記述した場合はPHPファイルを実行したファイルがある位置からの相対パス、
つまりこの場合であればsrc/foo/B.phpではなく、存在しないsrc/B.phpをよんでいることになります。
ドキュメントルートからの指定
require_once $_SERVER['DOCUMENT_ROOT'].'/foo/A.php';
現在実行されているスクリプトが存在するドキュメントルート ディレクトリです。サーバーのコンフィグレーションファイルで 定義されています。
$_SERVER['DOCUMENT_ROOT']はApacheの場合httpd.confで設定されています。
ローカルと本番環境など設定によっては差異があることがあります。
サーバーのルートからの指定
require_once '/var/www/html/src/foo/A.php';
ドキュメントルートとサーバーのルートは別物です。
現在は/src/をドキュメントルートに設定しているという想定ですが、
サーバーのルートからパスを指定する場合はドキュメントルートより上のディレクトリも記述しないといけません。
/var/www/html/はサーバーの設定によって異なります。
include_pathでの指定
require_once 'foo/A.php';
ファイルのインクルードは、指定されたパスから行います。パスを指定しない場合は、 include_path の設定を利用します。 ファイルが include_path に見つからないときは、include は呼び出し元スクリプトのディレクトリと現在の作業ディレクトリも探します。
相対パスと同じ記述方法ですが、include_pathが設定されている場合、include_pathから先にファイルを探してくれるようです。
include_pathはphp.iniや.htaccess、set_include_path関数などで設定できます。
dirname(__FILE__)での指定
__DIR__と同じ意味です。
__DIR__が追加されたのが5.3.0以降なのでそれ以前のバージョンではこちらを使用します。
| 5.3.0 | __DIR__ と __NAMESPACE__ が追加されました。 |
|:--|:--|
以下余談
include, requireの違い
処理失敗時にエラーを発するか、警告を発するか。
require : エラー(処理がストップする)
include : 警告(処理は続行)
require_onceとrequireの違い
require_onceは一度しか呼び出さない。
$foo = 1;
$bar = 1;
require_once 'foo.php';
$foo ++;
var_dump($foo); // 2
/*
foo.phpは一度しか呼び出されないので$fooが初期化されない
*/
require_once 'foo.php';
var_dump($foo); // 2
require 'bar.php';
$bar ++;
var_dump($bar); // 2
/*
bar.phpがもう一度呼び出されるのでbar.phpが初期化される
*/
require 'bar.php';
var_dump($bar); // 1
オートローダを使う
いちいちrequire_onceを記述するのも面倒なのでオートローダを使った方が良さそう。
オートローダーはspl_autoload_registerを使って自作することもできますが、
Composerを使うのが楽でよさそうです。
参考
【PHP】include, requireの安全なパスの書き方と違い
【PHP】include, requireの違いと使い分け