我有一个数据库类,它的实例在主声明index.php
为
$db = new Database();
有没有为一个方法$db
变量中的所有其他类全球公认无需声明
global $db;
每个类的构造函数?
我有一个数据库类,它的实例在主声明index.php
为
$db = new Database();
有没有为一个方法$db
变量中的所有其他类全球公认无需声明
global $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函数间共享变量,但不使用全局
使全局变量访问一类内的每个功能
全球或辛格尔顿数据库连接
我这样做有点不同。 我通常有一个全球性的应用对象(应用程序)。 在该对象我喜欢我创造分贝对象,缓存对象等一些基本的初始化
我也有一个返回应用程序对象的全局函数....从而(应用对象定义未示出):
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');