6

我有一个数据库类,它的实例在 main 中声明index.php

$db = new Database();

有没有办法让$db变量在所有其他类中被全局识别而无需声明

global $db;

在每个类的构造函数中?

4

5 回答 5

16

不,您必须在每个类的构造函数中声明 Global $db。

或者您可以使用全局数组: $_GLOBALS['vars'];

解决这个问题的唯一方法是使用静态类来包装它,称为单例方法(请参阅此处了解说明)。但这是非常糟糕的做法。

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

创建单例方法是为了确保任何类只有一个实例。但是,因为人们使用它作为一种快捷方式,所以它被称为懒惰/糟糕的编程。

StackOverflow 知识
如何避免使用 PHP 全局对象
在 PHP 中的函数之间共享变量而不使用全局
使全局变量对类中的每个函数都可访问
全局或单例用于数据库连接

于 2009-08-05T16:53:02.267 回答
2

我做的有点不同。我通常有一个全局应用程序对象(App)。在那个对象中,我做了一些基本的初始化,比如创建我的数据库对象、缓存对象等。

我还有一个返回 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();

它并不完美,但我发现它在许多情况下让事情变得更容易。

于 2009-08-05T21:04:46.237 回答
1

你可以使用

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

或者使用某种单例访问方法

Database::getInstance()->doStuff();
于 2009-08-05T16:53:54.230 回答
1

为什么不创建一个包含global $db;它的构造函数的类,然后从中扩展所有其他类呢?

于 2009-08-05T17:35:55.907 回答
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 回答