質問
PHPのオートロード機能を使用して、必要なクラスファイルのみを動的にロードする予定です。すべての関数に個別のファイルがある場合、これは巨大な混乱を引き起こす可能性があるため、関連するクラスを1つのクラスファイルに残して自動ロードする方法があることを願っています
function __autoload($class_name){
include('classes/' . $class_name . '.class.php');
}
動物というクラス名があり、次に犬という名前の別のクラスがあるとします。 dogsクラスはanimalsクラスを拡張します。dogsクラスを呼び出すが、animalsクラスを呼び出さない場合、animalsクラスファイルはロードされますか?
解決
犬のクラスを呼び出す場合、 動物クラスを呼び出さないでください 動物クラスファイルはまだロードされていますか?
はい。別のクラスを拡張するクラスをロードする場合、PHPは基本クラスをロードする必要があります。そのため、PHPは拡張対象を認識します。
re:ファイルごとに複数のクラスを保存するという考え方:これは、指定した自動ロード機能では機能しません。特に自動ロードされたクラスの場合、ファイルごとに1つのクラスが本当にベストプラクティスです。
ファイルに複数のクラスがある場合、そのファイルからクラスを自動ロードしようとしないでください。
他のヒント
クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
class Import
{
public static クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
//Define autoload items
Import::Push('Admin_Layout', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient', App::$Path . '/PHP/FileClient.php');
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
Import::Auto()
そして最後に、呼び出してAutoLoadを有効にします
Import::Push('MyModule', App::$Path . '/Module/MyModule/Init.php');
良い点の1つは、「モジュール」を定義できることです:
Import::Load('MyModule');
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
AutoLoad = array();
public static クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
Imported = array();
public static function Load($sName)
{
if(! isset(self::クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
AutoLoad[$sName]))
throw new ImportError("Cannot import module with name '$sName'.");
if(! isset(self::クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
Imported[$sName]))
{
self::クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
Imported[$sName] = True;
require(self::クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
AutoLoad[$sName]);
}
}
public static function Push($sName, $sPath)
{
self::クラスの場所の明示的な定義を検討しましたか?関連するクラスをグループ化することが非常に理にかなっている場合があります。
実証済みの処理方法を次に示します。
このコードは、 auto_prepend_file
に配置されます(または最初に含まれます)
<*>
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>
そして最後に、呼び出してAutoLoadを有効にします
<*>
良い点の1つは、「モジュール」を定義できることです:
<*>
そして、必要なときに明示的にロードします:
<*>
そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
AutoLoad[$sName] = $sPath;
}
public static function Auto()
{
function __autoload($sClass)
{
Import::Load($sClass);
}
}
}
そして、ブートストラップファイルで、クラスとクラスが含まれているファイルを定義します。
<*>そして最後に、呼び出してAutoLoadを有効にします
<*>良い点の1つは、「モジュール」を定義できることです:
<*>そして、必要なときに明示的にロードします:
<*>そして最良の部分の1つは、モジュールに追加の Import :: Push
行を追加できることです。これにより、実行時にすべてのクラスが定義されます。
はい、クラスファイルを含めない/必要としない限りロードします。
必要なPHPコードを含むファイルは常にインポートする必要があります。 PHP自体は、クラスファイルに付けた名前を推測できません。たとえばJavaとは異なり、PHPにはクラスのファイル命名要件はありません。
この問題を解決する一般的な方法は、関連するクラスを1つのファイルにグループ化することです。 「モジュール」を作成します。
回避策があります、私はそれを使用したばかりで、うまくいくようです:
animals.class.phpに格納されたanimalsと呼ばれる自動ロードされたクラスがあると仮定しましょう。同じファイルに、動物を拡張する他のクラスを含めることができます
class animals{
static function load(){
return true;
}
}
class dogs extends animals{
}
class cats extends animals{
}
Now ...クラス dogs
を使用する必要がある場合、親クラスであるPHPの自動ロードが必要です(これを行うと、同じファイル内のすべての拡張クラスも解析されます)書く必要があります:
animals::load();
$fuffy = new dogs();