すべてのPHPクラスのコンストラクターで変数をグローバルに宣言することなく、変数をグローバルに表示できますか?

StackOverflow https://stackoverflow.com/questions/1234445

質問

データベースクラスがあり、そのインスタンスはメインの index.php

として宣言されています
$db = new Database();

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

global $db;

各クラスのコンストラクター内

役に立ちましたか?

解決

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

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

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

  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.
   }

シングルトンメソッドは、クラスのインスタンスが1つだけであることを確認するために作成されました。しかし、人々はグローバル化を短縮する方法としてそれを使用するため、遅延/不良プログラミングとして知られるようになります。

StackOverflowナレッジ
PHPグローバルオブジェクトの使用を避ける方法
グローバルを使用せずにPHPの関数間で変数を共有する < br> すべての関数でグローバル変数をアクセス可能にするクラス内
データベース接続用のグローバルまたはシングルトン

他のヒント

私はそれを少し変えました。通常、グローバルアプリケーションオブジェクト(App)があります。そのオブジェクト内で、dbオブジェクトの作成、オブジェクトのキャッシュなどの基本的な初期化を行います。

Appオブジェクトを返すグローバル関数もあります......したがって(アプリケーションオブジェクトの定義は表示されません):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

function app() {
    return $GLOBALS[APPLICATION_ID];
}

そのため、コード内の任意の場所で次のようなものを使用して、グローバルオブジェクト内のオブジェクトを参照できます。

app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();

それは完璧ではありませんが、多くの状況で物事を簡単にすることができます。

使用できます

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

あるいは、何らかの種類のシングルトンアクセス方法を使用する

Database::getInstance()->doStuff();

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

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

class Registry
{
    protected static 

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

<*>data = array(); public static function set($key, $value) { self::

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

<*>data[$key] = $value; } public static function get($key, $default = null) { if (array_key_exists($key, self::

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

<*>data)) { return self::

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

<*>data[$key]; } return $default; } } Registry::set('db', new Database()); $db = Registry::get('db');
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top