私は高度なPHP標準を学び、新しい便利なメソッドを実装しようとしています。以前、私は__autoload
を使用して各ページに複数のファイルを含めてエスケープしていましたが、最近では __autoload manual
のヒントを見ました
spl_autoload_register()は、クラスを自動ロードするためのより柔軟な代替手段を提供します。このため、__ autoload()の使用は推奨されておらず、今後廃止されるか削除される可能性があります。
しかし、私は本当に spl_autoload
と spl_autoload_register
を実装する方法を理解することはできません
spl_autoload_register()
を使用すると、PHPがスタック/キューに入れて「新しいクラス」が宣言されたときに順次呼び出す複数の関数(または独自のAutoloadクラスの静的メソッド)を登録できます。
たとえば、次のとおりです。
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
上記の例では、「MyClass」はインスタンス化しようとしているクラスの名前です。PHPは、この名前を文字列としてspl_autoload_register()
に渡します。適切なクラス/ファイルを「含める」ために使用します。結果として、include/requireステートメントを介してそのクラスを具体的に含める必要はありません...
上記の例のようにインスタンス化するクラスを呼び出すだけで、すべてのクラスの場所を特定する独自の関数(spl_autoload_register()
を介して)を登録したので、PHPその関数を使用します。
spl_autoload_register()
を使用する利点は、__autoload()
とは異なり、作成するすべてのファイルに自動ロード機能を実装する必要がないことです。 spl_autoload_register()
では、複数の自動ロード関数を登録して、自動ロードを高速化し、さらに簡単にすることもできます。
例:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
spl_autoload に関して、マニュアルには次のように記載されています。
この関数は、
__autoload()
のデフォルト実装として使用することを目的としています。他に何も指定されておらず、spl_autoload_register()
がパラメーターなしで呼び出された場合、この関数は__autoload()
への以降の呼び出しに使用されます。
より実用的な用語では、すべてのファイルが単一のディレクトリにあり、アプリケーションが.phpファイルだけでなく、たとえば.inc拡張子を持つカスタム構成ファイルを使用する場合、使用できる1つの戦略は、すべてを含むディレクトリを追加することですPHPのインクルードパスへのファイル(set_include_path()
経由)。
構成ファイルも必要なので、spl_autoload_extensions()
を使用して、PHPが検索する拡張機能をリストします。
例:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Spl_autoloadは__autoload()
マジックメソッドのデフォルト実装であるため、PHPは、新しいクラスをインスタンス化するときにspl_autoloadを呼び出します。
お役に立てれば...
PHP 5.3以降、名前空間でspl_autoload_register()
を使用できます。つまり、__autoload()
関数を再定義することなく、プロジェクトを整理し、PHPクラスをオートロードできます。
この動作を実証するには、index.phpというファイルを作成します。
<?php
spl_autoload_register();
var_dump(new Main\Application);
次に、index.phpファイルのすぐ横にあるMainという名前のフォルダーを作成します。最後に、MainにあるApplication.phpというファイルを作成し、次のコードをそこに貼り付けます。
<?php namespace Main;
class Application{}
Autoloadの使用方法は次のとおりです。この例では、3つの異なるディレクトリからクラスをロードします。
function namespaceAutoload($rawClass){
$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);
$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';
foreach ($possiblePaths as $templatePath) {
$path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
if (file_exists($path)) {
require_once "$path";
break;
}
} spl_autoload_register("namespaceAutoload");
与えられた例では、PHPはこれら3つの異なるファイル名形式を使用して、これら3つのディレクトリでnamespace\classを探します。