2009-08-05 10 views
6

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

$db = new Database(); 

としてメインindex.phpに宣言されているデータベースクラスを、持っているが$db変数がグローバル

global $db; 
を宣言しなくても、他のすべてのクラスで認識されるための方法はあります各クラスのコンストラクタの

+0

他のどのクラスでも実際に使用する必要がありますか? –

+0

すべてではありませんが、かなりの金額です。 –

答えて

16

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

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

これを回避する唯一の方法は、Singleton Methodと呼ばれる静的なクラスをラップすることです(説明はHereを参照)。しかし、これは非常に悪い習慣です。

シングルトンメソッドは、クラスのインスタンスが1つだけ存在するように作成されました。しかし、人々はそれをグローバル化のための方法として使用するため、レイジー/悪いプログラミングとして知られています。

StackOverflowの知識
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection

+0

なぜdownvote? –

+0

私は、シングルトン法はこれに対する正しい答えではないと言いました。しかし、それは「技術的に」使用できるので、私はそれを含めました。 –

+0

私はダウン投票ではありませんでした。私に知らせてくれてありがとう - 私は悪い習慣を避けたいです。 –

1

をあなたはシングルトンアクセス方法のいくつかの種類を使用して

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

またはその代わりに使用することができ

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

どちらかの方法が悪い習慣ですか?データベースクラスを各クラス内でグローバルとして宣言するのがベストプラクティスですか? –

0

Databaseインスタンスを保存して取得するには、Registryクラスを使用できます。

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'); 
+0

これは基本的にデータのシングルトンクラスです.... –

+0

$ GLOBALS ... –

+0

'$ GLOBALS'と' global'キーワードは言語に組み込まれているため、誰もが知っているので高速です。レジストリクラスは追加されておらず、特別な機能は追加されていません。いくつかの 'Options'クラスは、アプリオプションを格納するのに便利かもしれませんが、おそらくそれは連想配列に置き換えられます。 –

1

それのコンストラクタでglobal $db;を含むクラスを作成しないのはなぜ、この他のすべてのクラスを拡張しますか?

2

少し違います。私は通常、グローバルアプリケーションオブジェクト(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(); 

は、それは完璧ではないのですが、私はそれは多くの状況で物事を簡単にするために見つけることを。

関連する問題