web-dev-qa-db-ja.com

ドットスラッシュはPHPインクルードコールに対して何をしますか?

A.これは何をしますか?

require ("./file.php");

B.これと比較して?

require ("file.php");

(そのnot up-one-directory ..これは)

require ("../file.php");
39
Robinicks

./currentディレクトリです。 file.phpとほぼ同じですが、多くの場合(これも含まれます)、標準の場所はチェックされませんPHPはファイルを検索する可能性があり、代わりにonly現在のディレクトリ。

PHPドキュメント (最後の文に注意)から:

インクルードするファイルは、最初に現在の作業ディレクトリに関連する各include_pathエントリで検索され、次に現在のスクリプトのディレクトリで検索されます。例えば。 include_pathがライブラリで、現在の作業ディレクトリが/ www /で、include/a.phpをインクルードし、そのファイルにinclude "b.php"がある場合、b.phpは最初に/ www/libraries /で検索され、次に/で検索されます。 www/include /。ファイル名が./または../で始まる場合、現在の作業ディレクトリでのみ検索されます。

48
Chris Lutz

最初のバージョンでは、内部メカニズムに、直接実行されたファイルに関連するファイルを含めるように強制します。だから例えばあなたは

index.php

// directly executed script (php -f index.php or from a browser)
include 'second.php';

second.php

// This is included relatively to index.php
// Actually, it is first searched relatively to include_path, then relatively
// to index.php
include './third.php';

third.php

// This is included relatively to second.php ONLY. It does not search
// include_path
return "foo";
9
Ionuț G. Stan

短い答え

そうです、それは1つのディレクトリではありません。 A。現在のディレクトリを指し、..は親ディレクトリを指します。

つまり、。/ file.phpとfile.phpはPHPでは機能的に同等です。ドキュメントの関連ページは次のとおりです。 http://us.php.net/manual/en/wrappers.file.php

長い答え

ただし、このコンテキストで同じように機能するからといって、常に同じであるとは限りません。

* nixシェル環境で操作しているときに、実行可能ファイルの名前を入力すると、シェルはPATHディレクトリを検索しますが、CWDまたは現在のディレクトリは検索しません。

したがって、myprogram.php(これはPHP CLIファイル)というファイルがあるディレクトリにいて、次のように入力するだけです。

myprogram.php

プログラムが実行可能かどうかは関係ありません。シェルは/ bin /、/ usr/bin /などでファイルを検索しますが、。/または現在のディレクトリは検索しません。

ディレクトリをPATHに追加せずにそのプログラムを実行するには、次のように入力する必要があります。

./myprogram

つまり、実際には、。/はより明示的です。これは、「探しているファイルがここにある」ことを意味し、。/は、「ファイルは、ファイルを探しているプログラムのどこかにあるはずです」という意味です。

6
danieltalsky

ドットスラッシュは、include_path設定で指定されたパスを追加で検索するのではなく、ファイルが現在のディレクトリでのみ検索されるように強制します。

5
Jeremy L

単に、現在のディレクトリonlyにファイルを含めるか、ファイルが存在しない場合は失敗するようにphpに指示しているだけです。

「indexcommon3.php」形式を使用していて、ファイルが存在しない場合、phpはそれをinclude_pathシステム変数で検索します。

参考までに使用できます http://www.php.net/manual/en/function.include.php

4
Eineki

編集:わかりやすくするために答えを完全に書き直しました


ファイルを含める場合は、./myfile.phpまたはmyfile.phpのいずれかを使用できます。

それらは同じではなく、何をしているのかわからない限り、常に最初の構文を使用することをお勧めします。

違いは、例で最もよく説明されています。次のファイルとフォルダー構造があるとします。

index.php
inc/inner.php

Index.phpから、「./」なしで内部テンプレートを含めることができ、期待どおりに機能します。

# index.php
<?php
include "inc/inner.php";

ここで、新しいファイルを追加するとします。そのため、フォルダー構造は次のようになります。

index.php
inc/inner.php
inc/inner-inner.php

inner-inner.phpinner.phpに含めるには、これを行います...そうですか?

# src/inner.php
<?php
include "inner-inner.php";

間違ったindex.phpは、ルートフォルダ内のinner-inner.php *を検索します。

index.php
inc/inner.php
inc/inner-inner.php
* inner-inner.php <- Doesn't exist, PHP ERROR.

代わりに、./構文を使用してinner-innerを含める必要があります。これにより、含めるファイルを含める必要があることが指示されます現在の「エントリポイント」ではなく、現在のファイルに対して PHPスクリプト。

# src/inner.php
<?php
include "./inner-inner.php";

さらに、他のコメントで述べられているように、PHPアプリケーションに別の「ロードパス」を構成した場合、そのロードパスは./構文なしで最初に検索されます代わりに、./構文は、phpの「インクルードパス」をチェックしないため、より効率的です。

インクルードをさらに明示的にしたい場合は、__DIR__定数を使用してください。これはphpに「このファイルがある現在のディレクトリを印刷する」ことを伝えます。

# src/inner.php
<?php
include __DIR__ . "/inner-inner.php";

TLDR;常に./または__DIR__を使用してください。これは、作業ディレクトリに相対的であり、phpの「インクルードパス」に依存しないためです。

2
Fran Cano

currentディレクトリに明示的に名前を付けています。

0
Charlie Martin