include や require は相対パスを指定、絶対パスを指定、さらにはパスを指定しない、の3通りがある。いったいどれがいいのか?

パスを指定しない場合、マニュアルでは「include_path の設定を利用します。 ファイルが include_path に見つからないときは、include() は呼び出し元スクリプトのディレクトリと現在の作業ディレクトリも探します。」とある。
これは最終的にどのファイルが使われたか分かりにくいように思う。include_path の設定をいつやるかという問題もあるし、include_path の設定は php.ini でもできるし、include_path には複数のディレクトリを指定できるし。。。これでは混乱していそう。
第一ファイル探索のためにパフォーマンスも悪いはずだ。

相対パスの指定では、inlcude したファイルの中でさらに inlcude しているような場合に問題となる。
たとえば以下のような場合、include2 には、inc.php からの inc2.php の相対パスではなく、a.php を起点とする inc2.php の相対パスを指定しないといけない。
もし、a.php を起点とする inc2.php の相対パスと、b.php を起点とする inc2.php の相対パスが違っていたら破綻してしまう。

・a.php -(include1a) -> inc.php -(include2) -> inc2.php
・b.php -(include1b) -> inc.php -(include2) -> inc2.php

そこで絶対パスを使用することにする。
絶対パスの取り方は以下の2通りが多いようだ。

・dirname(__FILE__)
・$_SERVER['DOCUMENT_ROOT']

dirname(__FILE__) は呼び出し側のファイル位置を取れるが、たとえば a.phpでは
include(dirname(__FILE__) . '/inc/inc.php');
と書き、b.phpでは
include(dirname(__FILE__) . '/../inc/inc.php');
となることもあり、同じファイルを include するのにも関わらず書き方が違って気持ち悪い。

一方、$_SERVER['DOCUMENT_ROOT'] のほうは、ドキュメントルートのパスを返すので、どこで呼び出しても一定であり、常に
include($_SERVER['DOCUMENT_ROOT'] . '/inc/inc.php');
と書ける。

しかし、$_SERVER['DOCUMENT_ROOT'] のほうはシェルで実行されたとき値が取れないので注意。

以上。