-2

データベース クラスに問題があります。必要なすべてのメソッドをプッシュし、クラスを閉じた後、そのインスタンスを作成し、$database 変数に影響を与えています。次に、インデックス ページでファイルを明示的に要求しません。これは、__autoload 関数を設定してそれを行うためです。しかし、たとえば設定した $database->isConnected() メソッドを使用しようとすると、機能しません。インデックス ページで $database の別のインスタンスを作成する必要があります。つまり、新しい dataBase() を呼び出します。繰り返しますが、その場合にのみ自動ロードが機能します。

ここではコードは必要ありません。誰かがそれを行う論理的な理由を教えてほしいだけです。単なるコピペよりも理解を深めたい。私は回避策を見つけたので、新しいページで毎回インスタンスを作成し、クラスページで確認するだけです。

4

1 に答える 1

1

あなたの説明から得たコードは次のとおりです。

ファイル: database.php

class Database {
    isConnected() {
        //Some code
    }
}
$database = new Database();

ファイル: index.php

function __autoload ($class) {
     include $class+'.php';  //Note this is highly unsafe
}
$database->isConnected();

問題は、__autoload()あなたが思っていることをしていないことです。

__autoload()参照時にまだ定義されていないクラスをロードします。$databaseしかし、PHP はそれが class であることを知りませんDatabase。それに関する限り、それはその時点で未定義の変数です。

あなたがした場合:

ファイル: database.php

class Database {
    isConnected() {
        //Some code
    }
}

ファイル: index.php

$database = new Database();

PHP は、データベースが定義されていないことを認識し、database.php をロードする呼び出しを行います (正しく定義されていると__autoload()仮定します)。__autoload()次に、コンストラクターが実行され、$database正しく設定されます。

すべきことは、データベース ファイルをインクルードするか ( include 'database.php')、静的メソッドを使用することです (例: Database::getDatabase();)。クラスは参照されるため、PHP は__autoload()それを認識します。

于 2012-09-09T15:59:36.143 に答える