ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルでの autoload の使用法の概要

php_PHP チュートリアルでの autoload の使用法の概要

WBOY
リリース: 2016-07-13 10:25:25
オリジナル
825 人が閲覧しました

PHP ではファイルを簡単にインクルードできるように Autoload が提供されていますが、Autoload は想像どおりにすべての状況を処理できるわけではありません。今日は、数日前に発生した Autoload に関する問題のいくつかを記録します。

自動ロードを使用する理由

PHP でクラスを使用する場合、require または include のどちらを使用しても使用前にクラスをロードする必要がありますが、ロードの決定に影響を与える 2 つの問題があります。

1 つは、このクラス ファイルがどこに保存されているかがわからないこと、もう 1 つは、このファイルをいつ使用する必要があるかがわからないことです。特にプロジェクトファイルの数が多い場合、各ファイルの先頭にrequireという長い文字列を書くのは不可能です...

PHP5 以降では、__autoload を通じてこの問題を解決できます。 また、PHP5.1 以降では、より完全なロード メカニズムを提供するために spl_autoload_register() も提供されています。

PHP での自動ロードの記事を読んだ後、クラス ファイルが extends を使用するか、他のクラスを使用する必要がある場合、クラスが new によってインスタンス化されると、PHP は定義された __autoload 関数を通じて対応するファイルをロードします。ファイルの場合、PHP はクラス ファイルを検索してロードするために自動ロードを再実行します。同じクラス ファイルに対する 2 つのリクエストが発生すると、エラーが報告されます。元の記事の著者は、この問題を説明するために 3 つの興味深い例を提供しました。これらの例は、ここからソース コードをダウンロードして表示できます。

一般に、ロード時に対応する場所でファイルが見つからないという問題を解決する方法はたくさんあります。最も一般的に使用されるのは、特定の命名標準を指定することです。

Zendのメソッド

zend は、ファイル名にパスを含める、最も一般的な方法の 1 つを推奨します。たとえば、次の例:

// Main.class

function __autoload($class_name) {
$path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'.php';
$temp = new Main_Super_Class(); 上記の例では、パス内のすべてのアンダースコアが区切り文字に置き換えられ、Main/Super/Class.php ファイルに到達します。

この方法の欠点は、コーディングプロセス中に、コードファイルをどこに置くべきかを明確に知る必要があることです。

ファイル パスはクラス名にハードコーディングされています。フォルダー構造を変更する必要がある場合は、すべてのクラス名を手動で変更する必要があります。

「すべてを含める」メソッド

開発環境にいて、速度をあまり気にしない場合は、この方法を使用すると非常に便利です。すべてのクラス ファイルを 1 つまたは複数の特定のフォルダーに配置し、検索してロードします。 例: 代 コードをコピーします

コードは次のとおりです:

& lt ;? PHP
$ arr = array );

foreach($arr as $dir) { $dir_list = opendir($dir); while ($file = readdir($dir_list)) { $path = $dir.DIRECTORY_SEPARATOR.$file if(in_array($file, array('.', '..')) || is_dir($パス))
続行します。 ️ require_once $path;
別の方法は、クラス ファイルとその場所の間に関連する設定ファイルを確立することです。例:



コードをコピーします

コードは次のとおりです:


//configuration.php

array_of_associations = array(

'MainSuperClass' = 'C:/Main/Super/Class.php',
'MainPoorClass' = 'C:/blablabla/gy.php'
);

というファイル



コードをコピーします

コードは次のとおりです。
require 'autoload_generated.php'; 関数 __autoload($className) {

グローバル $autoload_list;

}

$x = 新しい A() ?>;
もちろん、ファイルがたくさんあるとメンテナンスが面倒になりますが、クラス名で場所をハードコーディングするのとどちらが良いでしょうか? もちろん、このリストを手動で管理する必要はないので、このファイルの自動生成を使用してこれを実現できます。対応するファイルは phpxmljson などです。元の記事の著者は、このようなツールを実装しました。よく考えてみると、元の記事の著者は、学ぶ価値のある小さな Autoload フレームワークさえ開発しました。

http://www.bkjia.com/PHPjc/825066.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/825066.html技術記事 PHP ではファイルを便利にインクルードできるように Autoload が提供されていますが、Autoload は想像どおりにすべての状況に対応できるわけではありません。今日は数日前に遭遇した AU を記録します...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート