1

これは少し奇妙に聞こえるかもしれませんが、インクルード/使用する必要なく、任意のページ/クラスから呼び出すことができるスーパークラスまたはグローバル クラスを作成することは可能ですか?

ユーザーからのアクティビティとエラーを記録するアクティビティトラッカーとカスタムエラーログをサイトに配置したいのですが、すべてのページとすべてのクラスでそれらが必要です。すべてのアイテムをインポートするのではなく、常に利用できるものを作成できますか? PHPのコアクラスなど?(mysql_ 、ftp_、include_* など)

ありがとう!

4

2 に答える 2

2

少なくとも 1 つのファイルをインクルードしても問題ない場合は、オートローダーをインクルードに入れ、それがすべての読み込みを処理するようにすることができます詳細については、spl_autoload_registerこちらをご覧ください。

ドキュメントから、サンプルセットアップは次のようになります。

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}
spl_autoload_register('my_autoloader');

このコードは、すべてのページに含まれるファイルに入ります。これにより、クラス ファイルを手動でインクルードすることなく、次のことが可能になります。

$superClass = new SuperClass();

ここで、これを行うには、ファイルが にありclasses/SuperClass.class.php、実際にはclass SuperClass {宣言が含まれていると仮定します (必須ではありませんが、そうでない場合はエラーが発生します)。

ファイル命名スキーマと同様に、オートローダー関数で定義されたパスはいつでも変更できます。また、いくつかの異なる場所/ロジック、またはセットアップに合わせて必要なものを使用できます。

例えば:

function adv_autoloader($class) {
    if (file_exists('classes/' . $class . '.class.php') {
        require('classes/' . $class . '.class.php');
    } else if (file_exists('includes/' . $class . '.inc.php') {
        require('includes/' . $class . '.inc.php');
    } else {
        // can't locate the class
        throw new Exception('Class not found: ' . $class);
    }
}
于 2012-11-09T14:18:11.153 に答える
0

ソースコードを掘り下げたり、モジュールを追加したりすることなく(または、marioが述べたようにauto_prepend_fileを使用することなく)。ただし、オートローダーを使用して、必要に応じてクラスファイルを自動的に含めることができます。これは私が使用するコードです(名前空間を利用します):

  // Autoload any classes
  spl_autoload_register(function ($class)
  {

    // Throw an exception if the file does not exist or cannot be included
    if (!is_file($file = APPLICATION . ltrim(str_replace('\\', '/', $class), '/') . '.php') || !include $file)
    {
      throw new Exception(PAGE_NOT_FOUND);
    }

  }
  );

したがって、(名前空間を使用して)というクラスがあり、\Models\EmailAddressValidatorそれを保存して、それ/application/Models/EmailAddressValidator.phpを呼び出そうとすると、オートローダーにそのファイルが自動的に含まれるとします。

于 2012-11-09T14:17:47.987 に答える