[解決済み] なぜ include や include_once 文で dirname(__FILE__) を使うのでしょうか?
質問
こんなの見たことある。
<?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') の方が良いのでしょうか?
関連
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】XAMPPのphpMyAdminで「設定にあるcontroluserの接続に失敗しました。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] require(vendor/autoload.php): ストリームを開くのに失敗しました。
-
[解決済み] require, include, require_once, include_onceの違い?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】PHPで空の値からデフォルトオブジェクトを作成する?
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】書き込みコンテキストでメソッドの戻り値を使用することができない
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。