怎样避免使用PHP全局对象?(How to avoid using PHP global objec

2019-06-26 07:14发布

我目前正在创建博客系统,我希望变成一个完全的CMS的未来。

有两类/对象将是具有全局访问(和mysqli数据库连接并检查用户是否登录自定义类)是有用的。

我正在寻找一种方式来做到这一点,而不使用全局对象,并且如果可能的话,每次调用时没有通过对象的每个功能。

Answer 1:

你可以使物体静止,那么您可以访问他们的任何地方。 例:

myClass::myFunction();

这将在脚本的任何地方工作。 你可能想不过就静态班念了,可能使用Singleton类来创建一个可以在任何地方使用的静态对象内部的普通班。

扩展

我认为你正在试图做的是非常相似,我与我的DB类来完成。

class myClass
{
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        return self::$class;
    }
    // Then create regular class functions.
}

会发生什么事是你得到的连接后,使用$对象= MyClass的:: get_connection(),您将能够定期做任何功能。

$object = myClass::get_connection();
$object->runClass();

扩展

一旦你这样做静态声明,你只需要调用get_connection和返回值赋值给一个变量。 随后的其余功能可以作为一类你$类=新MyClass的调用(因为这是我们所做的)相同的行为。 所有你做的是存储静态类中的类变量。

class myClass
{
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        return self::$class;
    }
    // Then create regular class functions.
    public function is_logged_in()
    {
        // This will work
        $this->test = "Hi";
        echo $this->test;
    }
}

$object = myClass::get_connection();
$object->is_logged_in();


Answer 2:

你可以通过当前全局对象到构造。

<?php
  class Foo {
    protected $m_db;
    function __construct($a_db) {
      $this->m_db = $a_db;
    }
  }
?>


Answer 3:

我最近改组我的框架,准备为我们公司的CMS的第二个版本。 我为了与普通的对象,以取代他们解开一个巨大的我做了静态的事情量。 在这样做,我创建了一个用来靠我经历和侵入核心文件的灵活性,数额巨大。 我现在只使用静态构造时,唯一的选择是全球性的功能,这些功能只与低级别的核心功能。

我要告诉我的bootstrap.php文件中的几行(我所有的请求获得通过文件发送,但你可以通过把它包含在每个文件的顶部达到相同的结果)向您展示了我的意思。 这是一个什么样你可能在你的情况下使用了相当丰厚的版本,但希望这个想法是有帮助的。 (这是所有稍微修改。)

 //bootstrap.php

...

// CONSTRUCT APPLICATION

{       
    $Database = new Databases\Mysql(
        Constant::get('DATABASE_HOST'),
        Constant::get('DATABASE_USER'),
        Constant::get('DATABASE_PASSWORD'),
        Constant::get('DATABASE_SCHEMA')
    );

    $Registry     = new Collections\Registry;
    $Loader       = new Loaders\Base;
    $Debugger     = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console

    $Application  = new Applications\Base($Database, $Registry, $Loader, $Debugger);
}

...

正如你所看到的,我都挺创建我的应用对象,我可以在构造函数中的其他对象的参数给他们访问这些“全局”必需品提供的选项。

数据库对象是不言自明的。 注册表对象充当对象我可能要在其他地方访问应用程序的容器。 装载机充当加载其他资源,如模板文件的工具。 并且调试器是有处理调试输出。

我可以,例如,更改数据库类,我实例化,瞧我有一个SQLite数据库的连接。 我可以改变类的调试器(如备注),现在我所有的调试信息将被记录到我的JavaScript控制台。

好了,现在又回到这个问题。 你如何给其他对象访问所有的呢? 您只需通过它在参数构造函数。

// still bootstrap.php

...

// DISPATCH APPLICATION

{
    $Router = new Routers\Http($Application);
    $Router->routeUri($_SERVER['REQUEST_URI']); 
}

...

不仅如此,但我的路由器(或任何对象我就构建)更灵活,太。 现在,我可以只实例化我的应用对象不同,我的路由器将表现不同相应。



Answer 4:

好吧,如果你已经有了一些对象,通过它指的是博客系统,您可以撰写这些对象成,所以他们是$blog->db()$blog->auth()或什么的。



文章来源: How to avoid using PHP global objects?
标签: php global