Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以使变量全局可见,而不必在每个PHP类中声明为全局变量';谁的构造函数?_Php_Oop_Class_Variables_Global - Fatal编程技术网

我是否可以使变量全局可见,而不必在每个PHP类中声明为全局变量';谁的构造函数?

我是否可以使变量全局可见,而不必在每个PHP类中声明为全局变量';谁的构造函数?,php,oop,class,variables,global,Php,Oop,Class,Variables,Global,我有一个数据库类,它的实例在mainindex.php中声明为 $db = new Database(); 是否有一种方法可以使$db变量在所有其他类中全局识别,而无需声明 global $db; 在每个类的构造函数中?否。必须在每个类的构造函数中声明全局$db 或者您可以使用全局数组:$_GLOBALS['vars'] 解决这个问题的唯一方法是使用一个静态类来包装它,称为(请参阅以获取解释)。但这是非常糟糕的做法 class myClass { static $class

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

$db = new Database();
是否有一种方法可以使
$db
变量在所有其他类中全局识别,而无需声明

global $db;

在每个类的构造函数中?

否。必须在每个类的构造函数中声明全局$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.
   }
创建singleton方法是为了确保任何类只有一个实例。但是,由于人们使用它作为快捷方式全球化,它被称为懒惰/糟糕的编程

堆栈溢出知识



您可以使用

$GLOBALS['db']->doStuff();
或者使用某种单例访问方法

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

您可以使用
注册表
类来存储和检索
数据库
实例

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

为什么不创建一个包含
global$db代码,然后在此基础上扩展所有其他类?

我做的有点不同。我通常有一个全局应用程序对象(App)。在该对象中,我执行一些基本初始化,如创建我的db对象、缓存对象等

我还有一个全局函数返回应用程序对象…因此(未显示应用程序对象定义):

因此,我可以在任何代码中的任何地方使用以下内容来引用全局对象中的对象:

app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();

它并不完美,但我发现它在很多情况下都能让事情变得更简单。

我说单例法不是正确的答案。但我把它包括进来是因为它“技术上”是可以使用的。我没有被否决,谢谢你让我知道-我想避免不好的做法。我更新了一些其他链接,你可以查看。我确实支持对数据库类使用Singleton,但您仍然应该对其进行全局处理。嗯,对于在应用程序的每个类中轻松包含数据库类,您建议使用哪种方法?这个单例方法仍然不能使$db变量在其他类中成为全局变量。我建议只全局化所有内容。它非常简单明了,这对调试很重要。这两种方法中有哪一种是不好的做法?最好的做法是在每个类中将数据库类声明为全局类吗?您真的需要所有其他类都可以使用它吗?不是所有类,但数量很大。除了
$GLOBALS
global
关键字都内置在语言中,因此速度很快,大家都知道。您的注册表类不是,并且不添加额外的功能。某种类型的
Options
类可能对存储应用程序选项很有用,但即使是这样,也可能被关联数组所取代。这种基本结构不增加额外功能。但你可以自由添加。例如调试或日志功能。性能不是参数,对不起。。。我们现在处于OO上下文中。一旦你使用第三方软件,你就想封装你的数据。请参阅Zend框架中的Zend_注册表。
app()->db->read($statement);
app()->cache->get($cacheKey);
app()->debug->set($message);
app()->user->getInfo();