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

$db = new Database();

是否有用于$db变量在所有其他类全球公认无需声明的方式

global $db;

在每个类的构造函数?

有帮助吗?

解决方案

没有。你必须在每一个类的构造函数声明全局$ DB。

,也可以使用全局数组:$ _GLOBALS [ '瓦尔'];

要解决这个问题的唯一方法是使用静态类来包装它,叫辛格尔顿方法(参见这里一个解释)。但是,这是非常不好的做法。

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

的创建单方法,以确保有任何类的仅一个实例。但是,由于人们用它作为一种快捷globalling,就成了被称为懒/坏的编程。

StackOverflow的知识,点击 怎样避免使用PHP全局对象结果 在PHP函数关系共享变量,但不使用全局 < BR> 了一个全局变量访问为每个函数内部类结果 全局或单身数据库连接

其他提示

我做到这一点有所不同。我通常有一个全球性的应用对象(应用程序)。在该对象我喜欢我创造分贝的物体,对象缓存等一些基本的初始化。

我也有一个返回应用程序对象的全局函数....从而(应用对象定义未示出):

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 $_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');
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top