すべてのPHPクラスのコンストラクターで変数をグローバルに宣言することなく、変数をグローバルに表示できますか?
質問
データベースクラスがあり、そのインスタンスはメインの 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');