web-dev-qa-db-ja.com

set_include_path(get_include_path()。PATH_SEPARATOR。'phpseclib ');

私はphpでこれまで使用したことがない2つの関数に出くわしました

_set_include_path();
get_include_path();
_

私は現在、作業中のプロジェクトにphpseclibを実装しようとしています。SSH2のSFTPクラス拡張を使用する必要があるため、MathBigIntegerクラスなどが必要になります。

マニュアルにはset_include_path()について書かれています。

「スクリプトの期間中、include_path構成オプションを設定します。」

これは私のフレームワークの残りの部分にとって何を意味しますか、それはすべてのインクルードパスを「phpseclib」ディレクトリから設定しますか?

また、私は本当に得られません:

_set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
_

Php secをファイルシステムのカスタムライブラリディレクトリに保存していますが、get_include_path()はファイルシステム内のphpseclibディレクトリを魔法のように見つけますか?

あなたが見ることができるように、私はここで完全に失われています..誰かが私のためにいくつかの光を当てるのに十分親切でしょうか?

PS /このライブラリは、アプリケーションの特定の1つのポイントでのみ必要なので、必要な場合にのみ含めたいと考えています。現在、モデルクラスの子に含めたいと考えています。

12
John

まず最初に、 include_path 構成設定が何をするかを理解する必要があります。

Require、include、fopen()、file()、readfile()、およびfile_get_contents()関数がファイルを検索するディレクトリのリストを指定します。この形式は、システムのPATH環境変数に似ています。Unixではコロンで、Windowsではセミコロンで区切られたディレクトリのリストです。

PHPは、含めるファイルを探すときに、インクルードパスの各エントリを個別に考慮します。最初のパスをチェックし、見つからない場合は、含まれているファイルを見つけるか、警告またはエラーを返すまで、次のパスをチェックします。 set_include_path()を使用して、実行時にインクルードパスを変更または設定できます。

コンストラクト

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

上記の機能のいずれかを備えたファイルを含めるように要求すると、検索されるディレクトリのリストにphpseclibが追加されます。

phpseclibは相対パスであるため、効果は./phpseclibを指定した場合と同じです。つまり、PHPは、プロセスの現在のディレクトリ内のphpseclibという名前のサブディレクトリを調べます。ライブラリがファイルシステムのどこにあるかを魔法のように決定するのではなく、ライブラリが見つかる場所にライブラリを配置するのはあなたの仕事です。

16
Jon

include_pathが何であるか、何でないかをよりよく理解するには、php.iniマニュアルの このセクション をお読みください。

プロジェクト固有の「オートローダー」を作成しようとしている場合、set_include_pathはそのための最適なツールではありません(代わりに spl_autoload_register を調べてください)。あなたの質問に答えるために:

set_include_pathは、以前のinclude_pathが何であれ上書きします。 PATH_SEPARATOR定数を区切り文字として使用して、複数のパスを指定できます。例:

set_include_path($path1. PATH_SEPARATOR . $path2 . PATH_SEPARATOR . $path3);

したがって、次のように上書きする代わりに、既存のパスに追加できます。

set_include_path(get_include_path() . PATH_SEPARATOR . $mypath);
7
lafor

Set_include_pathは、PHPエンジンがファイルを検索するための可能な場所を設定するだけです。例:

set_include_path( WEBROOT_PRIVATE.'scripts\phpseclib' );
if(include('Net/SSH2.php')){
    echo 'pass';
} else {
    echo 'fail';
}
include WEBROOT_PRIVATE.'application/global_function_list.php';

上記は完全にうまく機能し、アプリケーションに必要な他のファイルを正しく含め続けています。

1
John

ジョン、2番目の例が失敗する理由は、「phpseclib」がフルパスを指定していないためだと思います。最初の例が機能すると仮定すると、置き換えたいと思うでしょう

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

set_include_path(get_include_path() . PATH_SEPARATOR . WEBROOT_PRIVATE.'scripts\phpseclib');

2番目の例では。 include_pathが本来あるべきものであることを確認するために、次の行を追加します。

echo get_include_path() . " is my include path.\n";

set_include_path()呼び出しの直後。

0
Rory Larson