設定にはパスと自動装飾が含まれていますか?
-
08-10-2019 - |
質問
必要なフォルダーの挿入パスを追加するだけでは、クラスにアクセスするのに十分ではないことに気付きました。
アプリケーション/テスト/test.phpを含むフォルダーアプリケーション/テスト/
クラスtest.phpは、プレフィックスなしでテストと呼ばれます
class Test {
}
インクルードパスにテストフォルダを追加する場合
realpath(APPLICATION_PATH . '/tests')
クラスtest.phpはコントローラーでは機能しません
new Test()
それで、インクルードパスにフォルダーを十分に含めていませんか?
解決
@Stasmには正しいです。しかし、ここにもう少し説明があります。
include_path
PHPが実行されたときにどこを見るかを指示します include
, 、an include_once
, 、a require
, 、またはa require_once
. 。もちろん、これら include
砂 require
sは常に特定を参照してください ファイル.
オートローディングとは、特に欠落に関するものです クラス. 。まだ非ロードされたクラスがコードで参照される場合 - 通常、排他的ではありませんが、 new
あなたの例のように、オペレーター - その後、オートローディングはクラスをロードするためのアルゴリズムでキックすることができるプロセスです。このプロセスは通常、欠落しているクラスの名前から始まり、可能なパス名のコレクションを作成することを伴います - ファイルシステム内の絶対またはの関連または include_path
- 行方不明のクラスの名前から、そして実行する include
クラスの定義がそれらの1つに存在することを期待して。
あなたの場合、あなたは「テスト」という名前のクラスを呼びました。このクラスを含むファイルはファイルにあります APPLICATION_PATH . 'tests/Test.php'
. 。そして、あなたはディレクトリを配置しました APPLICATION_PATH . 'tests'
の中に include_path
. 。しかし、自動装備アルゴリズムが整備されるまで、システムがクラス名を接続する方法はありません 'Test'
ファイル名に 'Test.php'
.
梨スタイルのクラス名コンベンション この接続を提供します。デフォルトのZend Framework Autoloaderのようにそのコンベンションを採用するオートローダーは、クラス名からファイル名へのマッピングを実行でき、次にそのマッピングを実行できます。 include
必要なファイル。
最終的な合併症として、従来のZend Frameworkディレクトリレイアウトコンベンションは、特定のクラスをフォルダーに配置します。 いいえ インクルードパス:モデル、フォーム、サービス、コントローラー、ビューヘルパー、アクションヘルパーなど。そのため、オートローダーのより多くの構成がよく見られるのは、通常は Bootstrap
クラス - 特定のクラス名とファイルシステム内の特定の場所の間のマッピングを定義する オフ include_path
.
たとえば、「default_model_user」という名前のクラスは、一見すると - include_path
ファイル内 'Default/Model/User.php'
. 。ただし、標準のアプリディレクトリ構造は、そのファイルを「アプリケーション/モデル/user.php」に配置したいと考えています。複数形に注意してください 「モデル」 そして小文字 'm' パス名とクラス名に「デフォルト」の存在。 Autoloaderの追加構成は、それを理解するために必要です。これは、ClassName-fileNameマッピングのパターンを提供します。これは通常、で行われます リソースオートローダー.
これがあなたまたは他の誰かのいずれかが役立つことを願っています。乾杯!
他のヒント
PHPが含めるスクリプトを探すパスショーを含める - あなたが言うときに include('blah.php')
PHPエンジンが探します blah.php
インクルードパスのすべてのパスで。
オートローディングとは、PHPがそのクラスが必要であるが定義されていない場合に特定の関数を呼び出すことを可能にする機能です。この関数では、インクルードパスを使用してクラスを含むファイルを見つけてロードできますが、これらはまったく異なるものです。
realpath()
それらのいずれにも関係がなく、特定のファイルの一意のファイルシステムパスを返す関数であり、 ..
そして、シンボリックリンクが解決しました。