0

PHPオートローダーについて頭を悩ませています。以下のコードがある場合:

  function __autoload($class) {require_once('scripts/classes/' . $class . '.class.php');}

クラスが上記のパスに合うように名前が付けられている限り、require_once を使用する必要があります

  require_once('scripts/classes/session.class.php');

注: サイトの header() に __autoloading を含めています (読み込まれる最初のページです。その機能を機能させるために、読み込まれる各ページにそれを含める必要がありますか? はいと仮定しますが、私はわからない...

ありがとうございました

4

3 に答える 3

2

ブラウザにロードされたすべてのページでを定義__autoloadまたは呼び出す必要があります。spl_autoload_registerしたがって、すべてのページが同じ「ヘッダー」を使用している場合は、そこに入れるだけで十分です。

それが完了したら、includeorを使用する必要はありませrequireん。 classSessionに言及するだけで、PHP は autoload 関数を使用して、まだ定義を認識していない場合に定義を見つけます。

于 2013-01-27T03:09:53.127 に答える
1

いいえ、を使用する必要がありますinclude()。クラスは、まだロードされていない場合に1回だけ含まれます。

PHPマニュアルから:

まだ定義されていないクラス/インターフェースを使用しようとした場合に自動的に呼び出される__autoload()関数を定義できます。

いいえ、アプリケーション全体にオートローダー機能を1回だけ含めることができます。

また、の代わりにspl_autoload_register()__autoload()を使用することをお勧めします。

于 2013-01-27T02:50:06.660 に答える
0

このファイルをスクリプトの先頭に含めて、この定数の代わりにディレクトリ レベルを設定することができます。WP_CONTENT_DIR これにより、必要なファイルが自動的に含まれます。

<?php

class autoload
{

    private static function updatePhpFiles($dir_level, $php_files_json_name)
    {
        /**Get all files and directory using iterator.*/
        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir_level));
        $filePaths = array();

        /**Get all php files in this directory level.*/
        foreach ($iterator as $path) {
            if (is_string(strval($path)) and pathinfo($path, PATHINFO_EXTENSION) == 'php') {
                $filePaths[] = strval($path);
            }
        }

        /**Encode and save php files dir in a local json file */
        $fileOpen = fopen($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name, 'w');
        fwrite($fileOpen, json_encode($filePaths));
        fclose($fileOpen);
    }

    private static function includeMatchingFiles($dir_level, $php_files_json_name, $class_file_name)
    {
        $files = json_decode(file_get_contents($dir_level . DIRECTORY_SEPARATOR . $php_files_json_name), true);
        $inc_is_done = false;

        /**Include matching files here.*/
        foreach ($files as $path) {
            if (stripos($path, $class_file_name)) {
                require_once $path;
                $inc_is_done = true;
            }
        }
        return $inc_is_done;
    }

    public static function include_system_files($dir_level, $class_name)
    {
        $php_files_json = 'phpfiles.json';
        $class_file_name = $class_name . '.php';

        /**Include required php files.*/
        if (is_file($dir_level . DIRECTORY_SEPARATOR . $php_files_json)) {

            if (self::includeMatchingFiles($dir_level,$php_files_json, $class_file_name)) {
                return true;
            } else {
                self::updatePhpFiles($dir_level, $php_files_json);
                return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);
            }

        } else {

            self::updatePhpFiles($dir_level, $php_files_json);
            return self::includeMatchingFiles($dir_level, $php_files_json, $class_file_name);

        }

    }

}

/**
 * Register autoloader.
 */
spl_autoload_register(function ($className) {
    autoload::include_system_files(WP_CONTENT_DIR, $className);
});
于 2018-07-21T08:40:11.110 に答える