ディレクトリ構造
1つは、自動読み込みの実現です。
-
__autoload
初期にサポートされていたバージョンのPHP。詳細については、公式文書を参照してください。
自動ロードを実装する必要がある場合は、この関数を定義することで有効にできます。
PHPスクリプトでそのような関数を定義し、その中にロードロジックを記述してください。例えば:function autoload($className){ $name = strtolower($className); $path= "./includes/{ $name}.php"; if(file_exists($path)){ require_once($path); }else{ die("the file { $className} could not be found"); } }
これ
includes
により、現在のディレクトリにあるファイルが自動的に読み込まれます。
同様の使用法は、プライベートプロジェクト、または単一プロジェクトのフレームワークでよく見られます。なぜですか?定義できるのは1つだけなので__autoload function
、マルチプレーヤー開発で異なる開発者が異なるカスタムオートローダーを使用することはできません。全員が事前に言っていない限り、1つを使用し__autoload
、変更が含まれる場合はバージョンを同期します。トラブル。 -
spl_autoload_register
したがって、上記の問題を解決するために、PHP7.2バージョンで導入されましたspl_autoload_register
。詳細については、公式文書を参照してください。
関数を定義できなくなりました。これは公式に定義された優れた関数であり、それを呼び出して、匿名関数にロードロジックを記述するだけで済みます。使用方法は以下のとおりです。
spl_autoload_register(function($className){ $name = strtolower($className); $path= "./includes/{ $name}.php"; if(file_exists($path)){ require_once($path); }else{ die("the file { $className} could not be found"); } });
このようにして、自動ロードの実現を完了することができます。さらに、複数のオートローダーが定義されています。
次のタイプのアクセスが使用されます。- 匿名関数を使用する
// 使用匿名函数来autoload spl_autoload_register(function($className){ require_once('...'); })
- グローバル関数を使用する
// 使用全局函数 function custom(){ require_once('...'); }
- クラスで静的メソッドを使用する
// 使用一个class当中的static的方法 class MyCustomAutoloader { public static function myLoader($className){ require_once('...'); } } // 传递array进来,第一个是class名,第二个方法名 spl_autoload_register(['MyCustomAutoloader', 'myLoader']);
- インスタンス化されたオブジェクトにも使用できます
// 甚至可以用在实例化的object上 class MyCustomAutoloader { public function myLoader($className){ require_once('...'); } } $object = new MyCustomAutoloader; spl_autoload_register([object, 'myLoader']);
特に公式文書に基づいています。
- 匿名関数を使用する
第二に、自動ロードの利点
自動ローディングは異なっているrequire
とinclude
。自動ロードメカニズムはレイジーロードです。つまり、実行するとすぐにすべてのファイルを呼び出すのではなく、どのファイルを使用した後、たとえばどのファイルが新しいかによってのみ、自動ロードメカニズムを介して対応するファイルがロードされます。
プログラムのパフォーマンスを向上させるために、多くの大規模なフレームワークはこのロード方法を使用します。たとえば、この方法はlaravelで広く使用されています。