[解決済み] オートロードとは何ですか; spl_autoload、__autoload、spl_autoload_register はどのように使うのですか?
質問
私はPHPの高度な標準を学び、新しい便利なメソッドを実装しようとしています。以前、私は
__autoload
は、各ページに複数のファイルを含めることを避けるためだけのものでしたが、最近になって
__autoload manual
spl_autoload_register() は、より柔軟な代替手段を提供します。 クラスをオートロードします。このため __autoload() は 将来的には推奨されないか、削除される可能性があります。
を実装する方法がわからないのです。
spl_autoload
と
spl_autoload_register
解決方法は?
spl_autoload_register()
を使用すると、複数の関数 (あるいは 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 拡張子のあるカスタム設定ファイルを使用している場合、 すべてのファイルを含むディレクトリを PHP のインクルードパスに追加する方法があります (via.
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 をコールします。
お役に立てれば幸いです...
関連
-
[解決済み】Notice: 非オブジェクトのプロパティを取得しようとしているエラー
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み】警告。数値でない値に遭遇しました
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み] PHP product.php?id=1 のような URL を作成する方法
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み] Long-Polling、Websocket、Server-Sent Events (SSE)、Cometとは何ですか?
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] PHPを使って現在の年を取得するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 整形されていない数値が発生しました。
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み】PHPからPythonスクリプトを実行する
-
[解決済み】mysqli_select_db()は、パラメータ1がmysqliであることを期待し、文字列が与えられる。
-
[解決済み】count()パラメータは配列かlaravelのcountableを実装したオブジェクトでなければならない
-
thinkphp5 timestamp 非整形の数値に遭遇した。
-
[解決済み] mysqli_fetch_assoc() は、パラメータ 1 が mysqli_result であることを期待し、boolean が与えられる [重複] 。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。