如何避免使用PHP全局对象?

Nic*_*rns 6 php global

我目前正在创建博客系统,我希望将来可以变成一个完整的CMS.

有两个类/对象可用于全局访问(mysqli数据库连接和一个用于检查用户是否已登录的自定义类).

我正在寻找一种不使用全局对象的方法,如果可能的话,每次调用时都不会将对象传递给每个函数.

Tyl*_*ter 13

您可以将对象设为静态,然后您可以在任何地方访问它们.例:

myClass::myFunction();
Run Code Online (Sandbox Code Playgroud)

这将适用于脚本中的任何位置.您可能希望阅读静态类,并且可能使用Singleton类在可以在任何地方使用的静态对象内部创建常规类.

扩展

我认为你要做的事情与我对数据库类的处理方式非常相似.

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.
}
Run Code Online (Sandbox Code Playgroud)

使用$ object = myClass :: get_connection()获得连接后,您将能够定期执行任何操作.

$object = myClass::get_connection();
$object->runClass();
Run Code Online (Sandbox Code Playgroud)

扩展

一旦执行了静态声明,就必须调用get_connection并将返回值赋给变量.然后其余的函数可以与使用$ class = new 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();
Run Code Online (Sandbox Code Playgroud)

  • 静态类只是另一种类型的全局对象. (4认同)
  • 是的,对于静态类,我做了同样的事情来声明变量$ class.唯一的事情是你必须声明你使用的每个变量. (2认同)
  • 每次创建新文件或类时都不必全局化,这是OP尝试修复的基本问题. (2认同)

Eug*_*ota 8

您可以将当前的全局对象传递给构造函数.

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