6

index.phpインスタンスがメインで宣言されているデータベースクラスがあります

$db = new Database();

$db変数を宣言しなくても、他のすべてのクラスでグローバルに認識される方法はありますか

global $db;

各クラスのコンストラクタで?

4

5 に答える 5

16

いいえ。すべてのクラスのコンストラクターで Global $db を宣言する必要があります。

または、グローバル配列を使用できます: $_GLOBALS['vars'];

これを回避する唯一の方法は、 Singleton メソッドと呼ばれる静的クラスを使用してラップすることです(説明については、こちらを参照してください)。しかし、これは非常に悪い習慣です。

  class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    // Then create regular class functions.
   }

singleton メソッドは、クラスのインスタンスが 1 つだけであることを確認するために作成されました。しかし、グローバリングをショートカットする方法として人々がそれを使用するため、怠惰/悪いプログラミングとして知られるようになります。

StackOverflow Knowledge
PHP グローバル オブジェクトの使用を回避する方法 グローバルを
使用せずに PHP の関数間で変数を共有
する クラス内のすべての関数でグローバル変数にアクセスできるよう
にする データベース接続のためのグローバルまたはシングルトン

于 2009-08-05T16:53:02.267 に答える
1

コンストラクターにを含むクラスを作成しglobal $db;、それから他のすべてのクラスを拡張してみませんか?

于 2009-08-05T17:35:55.907 に答える
1

あなたが使用できる

$GLOBALS['db']->doStuff();

または代わりに、ある種のシングルトン アクセス メソッドを使用する

Database::getInstance()->doStuff();
于 2009-08-05T16:53:54.230 に答える
0

クラスを使用して、インスタンスRegistryを格納および取得できDatabaseます。

class Registry
{
    protected static $_data = array();

    public static function set($key, $value)
    {
        self::$_data[$key] = $value;
    }

    public static function get($key, $default = null)
    {
        if (array_key_exists($key, self::$_data)) {
            return self::$_data[$key];
        }

        return $default;
    }
}

Registry::set('db', new Database());
$db = Registry::get('db');
于 2009-08-05T17:08:35.853 に答える