我可以做,而不必声明它在每一个PHP类的构造函数全局变量全局可见?
题
我有一个数据库类,它的实例在主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');
不隶属于 StackOverflow