"超全球对象"

Joe*_*ack 1 php

使用以下作为示例($ db是以前创建的数据库连接对象)...

Class Session {
   function write_log () {
     global $db;
     $db->query(...);
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免每次我想在另一个类中使用$ db对象时写"global $ db"?换句话说,从一开始就将$ db对象声明为超全局.

Tat*_*nen 6

传递$db给类构造函数:

class Session {
    function __construct($db) {
        $this->db = $db;
    }

    function write_log () {
        $this->db->query(...);
    } 
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

$session = new Session($db);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的方法...使用全局变量将使您的代码不可读,不可维护,并在几个月或几年后无法使用... (2认同)

Dan*_*uis 5

Superglobals是PHP提供的一组特定的内置变量,可以在任何地方访问,无需声明global:

$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
Run Code Online (Sandbox Code Playgroud)

一般来说,不可能创建自己的超级全局.

但是,您可以$db在您的Session班级中添加成员,并参考$this->db:

class Session
{
   public $db;

   function __construct()
   {
     $this->db = ... // set up $db object
     // ...
   }

   function write_log ()
   {
     $this->db->query(...);
   }
}
Run Code Online (Sandbox Code Playgroud)