1

spl_autoload_register()関数を使用してすべてのファイルを含めています。拡張機能を持つクラス.class.phpまたは.php直接インクルードするクラスが必要です。私は以下のクラスを作成し、2つの異なる関数を登録し、すべて正常に動作しましたが

両方の拡張機能を一緒に含めるには、1 つの関数のみを登録する必要があるように、いくつかの方法があると思います。

私の機能を見て、私が欠けているものを教えてください

私のフォルダ構造

project
      -classes
           -alpha.class.php
           -beta.class.php
           -otherclass.php
      -includes
           - autoload.php
      -config.inc.php // define CLASS_DIR and include 'autoload.php'

autoload.php

var_dump(__DIR__); // 'D:\xampp\htdocs\myproject\includes' 
var_dump(CLASS_DIR); // 'D:/xampp/htdocs/myproject/classes/' 
spl_autoload_register(null, false);
spl_autoload_extensions(".php, .class.php"); // no use for now
/*** class Loader ***/
class AL
{
     public static function autoload($class)
     {
          $filename = strtolower($class) . '.php';
          $filepath = CLASS_DIR.$filename;
          if(is_readable($filepath)){
              include_once $filepath;
          }
//          else {
//                trigger_error("The class file was not found!", E_USER_ERROR);
//            }
    }

    public static function classLoader($class)
    {
        $filename = strtolower($class) . '.class.php';
        $filepath = CLASS_DIR . $filename;
        if(is_readable($filepath)){
              include_once $filepath;
          }
    }

}
spl_autoload_register('AL::autoload');
spl_autoload_register('AL::classLoader');

注: line には影響しませんspl_autoload_extensions();。なぜ?

私もこのブログを読みましたが、実装方法がわかりませんでした。

4

2 に答える 2

3

やり方に間違いはありません。2 種類のクラス ファイル用の 2 つの特徴的なオートローダーは問題ありませんが、もう少しわかりやすい名前を付けます ;)

注: line には影響しませんspl_autoload_extensions();。なぜ?

これは builtin-autoloading にのみ影響しspl_autoload()ます。

やっぱりシングルローダーの方が使いやすいかも

 public static function autoload($class)
 {
      if (is_readable(CLASS_DIR.strtolower($class) . '.php')) {
          include_once CLASS_DIR.strtolower($class) . '.php';
      }  else if (is_readable(CLASS_DIR.strtolower($class) . '.class.php')) {
          include_once CLASS_DIR.strtolower($class) . '.class.php';
      }
}

クラス全体を省略することもできます

spl_autoload_register(function($class) {
    if (is_readable(CLASS_DIR.strtolower($class) . '.php')) {
        include_once CLASS_DIR.strtolower($class) . '.php';
    }  else if (is_readable(CLASS_DIR.strtolower($class) . '.class.php')) {
        include_once CLASS_DIR.strtolower($class) . '.class.php';
    }
});
于 2012-07-26T07:13:23.043 に答える
1

たぶんこれが役立ちます:

http://php.net/manual/de/function.spl-autoload-extensions.php

ジェレミー・クック 03-Sep-2010 06:46

この関数を使用して独自の autoload 拡張機能を追加する人への簡単なメモ。異なる拡張子 (つまり、'.php, .class.php') の間にスペースを入れると、関数が機能しないことがわかりました。機能させるには、拡張子間のスペースを削除する必要がありました (つまり、「.php,.class.php」)。これは Windows 上の PHP 5.3.3 でテストされており、カスタム autoload 関数を追加せずに spl_autoload_register() を使用しています。

それが誰かを助けることを願っています。

于 2012-07-26T07:07:23.907 に答える