1

必要なフォルダーのインクルードパスを追加するだけでは、クラスにアクセスするのに十分ではないことに気づきました。

application / tests/Test.phpを含むapplication/tests/フォルダーがあります。

クラスTest.phpは、プレフィックスなしのTestという名前です。

class Test {

}

インクルードパスにのみテストフォルダーを追加した場合

realpath(APPLICATION_PATH . '/tests')

Test.phpクラスはコントローラーでは機能しません

new Test()

では、インクルードパスにフォルダーを含めるだけでは不十分ですか?

4

2 に答える 2

2

インクルード パスは、PHP がインクルードしようとしているスクリプトを検索する場所を示します。つまり、include('blah.php')PHP エンジンがblah.phpインクルード パス内のすべてのパスを検索するとします。

オートローディングは、クラスが必要であるが定義されていないことを PHP が検出したときに、特定の関数を呼び出せるようにする機能です。この関数では、インクルード パスを使用してクラスを含むファイルを見つけてロードできますが、これらはまったく別のものです。

realpath()これらのいずれとも関係がなく、特定のファイルの一意のファイルシステム パスを返し..、シンボリック リンクなどを解決する関数です。

于 2010-12-11T04:08:30.257 に答える
2

@StasMはそれを正しく持っています。しかし、ここでもう少し説明を加えます。

include_path、PHP が an include、 an include_once、 a require、または aを実行するときに参照する場所を示しますrequire_once。もちろん、これらincludeの およびrequireは常に特定のファイルを参照します。

オートローディングは、特に欠落しているクラスに関するものです。まだアンロードされていないクラスがコードで参照されている場合 (通常、new例のように、排他的ではありませんが、オペレーターを呼び出すことによって)、オートロードは、クラスをロードするためのアルゴリズムで開始できるプロセスです。include_pathこのプロセスは通常、欠落しているクラスの名前から開始し、欠落しているクラスの名前から可能なパス名のコレクション (ファイルシステム内の絶対パスまたはファイル システム内のエントリに対する相対パス) を生成しinclude、クラスが定義はそれらの 1 つにあります。

あなたの場合、「Test」という名前のクラスを呼び出しました。このクラスを含むファイルは、 file にありますAPPLICATION_PATH . 'tests/Test.php'。そして、ディレクトリAPPLICATION_PATH . 'tests'を に配置しましたinclude_path'Test'しかし、自動読み込みアルゴリズムが導入されるまで、システムがクラス名をファイル名に関連付ける方法はありません'Test.php'

PEAR スタイルのクラス名規則は、この接続を提供します。そして、デフォルトの Zend Framework オートローダーのように、その規則を採用するオートローダーは、クラス名からファイル名、そしてinclude必要なファイルへのマッピングを実行できます。

最後の複雑な問題として、従来の Zend Framework ディレクトリ レイアウト規則では、モデル、フォーム、サービス、コントローラー、ビュー ヘルパー、アクション ヘルパーなど、特定のクラスがインクルード パスにないフォルダーに配置されます。オートローダ (通常はBootstrapクラス内) は、特定のクラス名include_path.

たとえば、'Default_Model_User' という名前のクラスは、一見するとinclude_pathファイル内に存在すると予想される場合があります'Default/Model/User.php'。しかし、標準のアプリ ディレクトリ構造では、そのファイルを「application/models/User.php」に配置する必要があります。パス名の複数形の「モデル」と小文字の「m」 、およびクラス名の「デフォルト」の存在に注意してください。それを理解するには、クラス名からファイル名へのマッピングのパターンを提供するために、オートローダーの追加の構成が必要です。これは通常、リソース オートローダーを使用して実行されます。

あなたまたは他の誰かのいずれかで、これが役立つことを願っています。乾杯!

于 2010-12-11T14:22:15.893 に答える