10

適切に名前空間が設定され、PSR-0 であるクラスをオートロードしました。app/lib/CI に配置しました。クラスとそのファイル名は同じ「DB」です。クラス ファイル自体には、実際のクラスの前に構成ファイルが含まれています。

require( 'config.php' );

class DB {
  // ...
}

静的メソッド connect を呼び出すと、::connect() 内からエラー メッセージが表示されるため、このクラスは明らかにオートロードです。問題は、含まれている config.php 内にあるグローバル変数が class::method 内で使用できないことです。

したがって、明確にするために、配列 $connection_settings は config.php 内にありますが、次を使用する場合でも:

global $connection_settings;

$connection_settings は connect メソッド内で設定されていません。

興味深いのは、クラスが自動ロードされていても、routes.php ファイルの先頭からクラスをインクルードすると、すべてが正常に機能することです。では、「通常」と見なす方法でオートローディングを機能させるために、私が正しく行っていないことは何ですか?

4

2 に答える 2

10

これは、Laravel ではなくComposerの問題です。Composer は、オートロード中にグローバル スコープを汚染しないようにあらゆる努力を払います ( #1297で簡単に説明します)。グローバル変数を強制したい場合は、それらを使用する関数と同様に、構成ファイルでそれらをグローバルとして宣言する必要があります。

PHPマニュアルには次のように書かれています。

関数の外で global キーワードを使用してもエラーにはなりません。ファイルが関数内からインクルードされている場合に使用できます。

以下のコードは私にとってはうまくいきます(PHP 5.4.13上のLaravel 4b4を使用)。いずれかのグローバル行を削除すると、コードが壊れます (さまざまな方法で)。

config.php

global $connection_settings;
$connection_settings = array(/* ... */);

DB.php

require 'config.php';
class DB {
    static function connect()
    {
        global $connection_settings;
        // Do something with $connection_settings
    }
}
于 2013-04-08T15:39:47.477 に答える