1

私は現在、PHPを使用して最初のWebサイトを作成しています。個々のページごとにオートロードを作成するのではなく、一般的なオートロード機能を備えた1つのファイルを作成したいと思います。

これが私のautoloadControl.php

// nullify any existing autoloads
spl_autoload_register(null,false);

//specify extensions that may be loaded
spl_autoload_extensions('.php. .class.php');

function regularLoader($className){
    $file = $className.'.php';
    include $file;
}

//register the loader function
spl_autoload_register('regularLoader');

これが私のindex.phpファイルです:

require("header.php");
require("autoloadControl.php");

$dbConnection = new dbControl();
$row=$dbConnection->getLatestEntry();

現在、$dbConnection = new dbControl()は次のエラーを表示します。

致命的なエラー:クラス'dbControl'

だから私の質問は、この方法で自動ロードを使用する方法はありますか、それとも別のファイルを使用するすべてのPHPファイルの先頭に配置する必要がありますか?

4

2 に答える 2

0

外部ファイルに配置spl_autoloadすることは有効であり、コードをより保守しやすくするための良い方法でもあります。10、20、またはそれ以上になる可能性のある場所を 1 か所で変更します。

dbControlあなたが提供したコードであなたのクラスが提供されていないようです。クラスを参照する前にインクルードしていて、クラスが適切に機能していれば、このタスクを問題なく実行できます。

require("header.php"); 
require("autoloadControl.php");  
$dbConnection = new dbControl(); // Where is this class located?

autoloadControl.phpファイルの OOP アプローチは次のとおりです。

<?php

class Loader
{    
    public static function registerAutoload()
    {
        return spl_autoload_register(array(__CLASS__, 'includeClass'));
    }

    public static function unregisterAutoload()
    {
        return spl_autoload_unregister(array(__CLASS__, 'includeClass'));
    }

    public static function registerExtensions()
    {
        return spl_autoload_extensions('.php. .class.php'); 
    }

    public static function includeClass($class)
    {
        require(PATH . '/' . strtr($class, '_\\', '//') . '.php');
    }
}

?>
于 2012-08-08T16:37:58.150 に答える
0

あなたの問題は、コールバックを定義する場所には関係ありませんが、どのように定義していますか。

を使用spl_autoload_extensions('.php')すると、カスタム コールバックと同じことが達成されます。コールバックがこれほど単純な場合、両方は必要ありません。あなたのコメントも間違っています-spl_autoload_register引数なしで呼び出すと、現在のコールバックはクリアされませんが、デフォルトのコールバックが登録されます。

しかし、あなたのコードでは引数をspl_autoload_extensions間違って指定しています - 拡張機能のカンマ区切りのリストでなければなりません。だから私はあなたが望むのはこれだと思います:

// Tell default autoloader to look for class_name.php and class_name.class.php
spl_autoload_extensions('.php,.class.php')
// Register default autoloader
spl_autoload_register();
// READY!

これがあなたのコードにもたらす主な違いは、デフォルトのオートローダーが 'dbcontrol.php' (すべて小文字) を探すのに対し、あなたのオートローダーは 'dbControl.php' (PHP コードで言及されているケース) を探すことです。いずれにせよ、確かに両方は必要ありません。

于 2012-08-08T17:05:09.677 に答える