PHP自動ロード自動ロードとspl_autoload_register

1つは、自動読み込みの実現です。

  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、変更含まれる場合はバージョンを同期します。トラブル。

  2. 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");
    	}
    });
    

    このようにして、自動ロードの実現を完了することができます。さらに、複数のオートローダーが定義されています。
    次のタイプのアクセスが使用されます。

    1. 匿名関数を使用する
      // 使用匿名函数来autoload
      spl_autoload_register(function($className){
              
              
      	require_once('...');
      })
      
    2. グローバル関数を使用する
      // 使用全局函数
      function custom(){
              
              
      	require_once('...');
      }
      
    3. クラスで静的メソッドを使用する
      // 使用一个class当中的static的方法
      class MyCustomAutoloader
      {
              
              
      	public static function myLoader($className){
              
              
      		require_once('...');
      	}
      }
      // 传递array进来,第一个是class名,第二个方法名
      spl_autoload_register(['MyCustomAutoloader', 'myLoader']);
      
    4. インスタンス化されたオブジェクトにも使用できます
      // 甚至可以用在实例化的object上
      class MyCustomAutoloader
      {
              
              
      	public function myLoader($className){
              
              
      		require_once('...');
      	}
      }
      $object = new MyCustomAutoloader;
      spl_autoload_register([object, 'myLoader']);
      

    特に公式文書に基づいています。

第二に、自動ロードの利点

自動ローディングは異なっているrequireinclude自動ロードメカニズムはレイジーロードです。つまり、実行するとすぐにすべてのファイルを呼び出すのではなく、どのファイルを使用した後、たとえばどのファイルが新しいかによってのみ、自動ロードメカニズムを介して対応するファイルがロードされます。
プログラムのパフォーマンスを向上させるために、多くの大規模なフレームワークはこのロード方法を使用します。たとえば、この方法はlaravelで広く使用されています。

おすすめ

転載: blog.csdn.net/u013866352/article/details/108361919