thinkphp学習--spl_autoload_registerカスタム自動ロード関数の詳細

2406 ワード

1.一つの問題を考える:
1つのphpページをインスタンス化する場合は、まず対応するクラスファイルを含まなければなりません.ページに複数のオブジェクトがインスタンス化されている場合は、どうすればいいですか.複数のクラスファイルが含まれていると思いますか?もしこのオブジェクトが現在のパラメータに基づいて動的にインスタンス化されたら、どうしますか?
2.プレゼンテーション
クラスファイルB.phpがAでこのクラスをインスタンス化していると仮定します.
         A.php  
                
<?php
                    require  'B.php';
                    $a = new B();

Aに多くのクラスが含まれていると、require文が多く、余計な感じがしますが、php 5の後にクラスファイルの自動ロードメカニズムが提供されています.
    __Autoload($className)関数は、次の点に注意して使用します.
              1.いつ呼び出しますか.--』存在しないクラスがインスタンス化されると、システムは自動的に__を呼び出します.Autoload()メソッド
              2.どんなパラメータを受け入れますか?現在のインスタンス化オブジェクトに対応するクラス名を受け入れます.たとえば、new D()伝達パラメータは、Dです.
上記のコードは次のようになります.
                A.php 
                     
   <?php
         function __autoload($className){
                require $className.'.class.php';
         }

    __Autoloadはシステム定義の関数ですが、自動ロード関数をカスタマイズできますか?もちろんいいです.phpのsplを使います.autoload_register()では、まずこの関数の定義を見てみましょう.
      bool spl_autoload_register ([ callback $autoload_function ] )
説明:callbackの可能な値:1.関数名2.クラスの静的メソッド3.public権限のクラスメソッド
カスタム自動ロード関数:
            
<?php
     spl_auto_register('my_autoload');
     function my_autoload($className){
              require $className.'.class.php';
     }

クラスの静的メソッドの登録:
         
 class Custom{
                   public static function my_autoload($className){
                         require $className.'.class.php';
                   }
              } 
  spl_auto_register(array('Custom','my_autoload'));
  $a =new A();

3.実際に適用される問題は? 
上はディレクトリの下に自動的にロードされるクラスファイルを解決しただけで、実際の開発プロセスではクラスファイルが複数の異なるファイルに置かれていますが、どうやって解決しますか?自動ロード関数のたびにディレクトリを指定しますか?
まずrequire()とinclude関数の2つの関数をロードするときにinclude_に基づいて検討します.pathが設定したパスはロードディレクトリを巡回するので、クラスファイルのディレクトリをここに追加すればいいです.
コード:
       
          $directory = array('D:/web/','D:/webServer/classes/');
          $include_path   = implode(PHP_SEPARATOR,$directory); 
          //PHP_SEPATATOR       , PATH_SEPARATOR  window  ';' , linux ':';
          set_include_path(get_include_path().PATH_SEPARATOR.$include_path);

  4.自動ロード関数は複数定義でき、実行時に定義された順序で