我可以做,而不必声明它在每一个PHP类的构造函数全局变量全局可见?(Can I make a var

2019-06-28 02:30发布

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

$db = new Database();

有没有为一个方法$db变量中的所有其他类全球公认无需声明

global $db;

每个类的构造函数?

Answer 1:

不可以。你必须在每一个类的构造函数声明全局$分贝。

或者您可以使用全局数组:$ _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函数间共享变量,但不使用全局
使全局变量访问一类内的每个功能
全球或辛格尔顿数据库连接



Answer 2:

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

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

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();

它并不完美,但我觉得它做的事情在很多情况下更容易。



Answer 3:

你可以使用

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

或者可替换地使用某种单接入方法的

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


Answer 4:

为什么不创建一个包含一类global $db; 在它的构造函数,然后从该延长所有其他类?



Answer 5:

你可以使用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');


文章来源: Can I make a variable globally visible without having to declare it global in every single PHP class's constructor?