web-dev-qa-db-ja.com

require( 'myParent.php')よりもrequire(dirname(__ FILE __)。 '/'。 'myParent.php')の方が優れているのは何ですか?

多くの有名なPHPスクリプトを含むWordPressは、ファイルを同じディレクトリに含める場合、_'myParent.php'_の代わりにdirname(__FILE__).'/myParent.php'を使用します現在実行中のスクリプト。

それらは同じものではありませんか?なぜもっとタイプするのが好きなのですか?

ありがとう。

17
datasn.io

PHPは、ファイルへの絶対パスを知る必要があります。 dirname(__FILE__).'/myParent.php'はすでに絶対パスですが、'myParent.php'では include_pathで指定されたパスを使用してルックアップする必要があります-) 絶対パスを取得し、ファイルを検索します。より良い選択は'./myParent.php'です:

ただし、PHPは、インクルードごとに現在のディレクトリを常にチェックするよりも、include './file'を明示的に使用する方が効率的です。

18
Gumbo

パフォーマンスの向上(ほとんどの場合、事前最適化*である可能性が高い)に加えて、環境のPHP構成に現在のディレクトリがない(.)インクルードパスの一部として。

* include_pathルックアップを必要とするパスと必要としない相対パスを使用したincludeのベンチマーク。それぞれ100000回以上の反復をテスト

結果

include("include.php"):   8.3664200305939s
include("./include.php"): 8.3511519432068s

(8.3664200305939 - 8.3511519432068) / 100000 = 0.000000152680874s

数百または数千のファイルを含めない限り、0.0000001はせいぜい無視できます。

テストコード

define("MAX", 100000);

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

echo "include(\"include.php\"):  {$_t}s\n";

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("./include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

テストは、2.16GHz Macbook 10.5.8でPHPバージョン5.2.9(www.entropy.chリリース7)を使用して実施されました。

14
Justin Johnson

PHPはinclude_pathファイルの検索を繰り返さないため、dirname + file nameの使用はわずかに高速です。速度が重要な場合は、さらに入力する可能性があります。

12
alexef

Include( './ file.php')に関する追加のメモ。

速度だけが重要な場合は、はい、include( './ file.php')を使用できますが、依存関係と相対パスの問題を解決する場合は、dirname(__ FILE __)を使用することをお勧めします。

_include('./file.php')
_

実行中のスクリプト(含むスクリプト)に関連するパスを作成しますが、

_include(dirname(__FILE__).'/file.php');
_

この行が存在する現在のスクリプト(includedスクリプト)に関連するパスを解決します。

一般に、dirname(__ FILE __)を使用すると、パフォーマンスの向上はごくわずかですが、dirname(__ FILE __)の方がはるかに信頼性の高いインクルードになるため、dirname(__ FILE __)を使用することをお勧めします。

/編集:上記のベンチマークはinclude('./something.php')のみに関係することにも注意してください。これは、include_pathウォーキングがないため、実際にはinclude('something.php')よりも高速ですが、dirname(__FILE__)dirname()関数呼び出しのオーバーヘッドが発生します。これにより、include_pathを歩くよりも遅くなります(include_pathに多くのパスがある場合を除く)。

7
gaborous