是否使用了$ GLOBALS变量?

时间:2013-12-02 17:48:01

标签: php oop global

基本上,我有一个“用户”类,其中一部分是这样的:

class user{
    private $username;

    public function get_last_visit(){
        return $GLOBALS['db']->get(
            'users',
            'last_visit',
            'username' => $this->username
        );
    }
}

我需要从“user”类中调用对象“db”的方法。使用以上最好的方法来解决这个问题?我听说有人说使用$ GLOBALS变量是不好的做法。

2 个答案:

答案 0 :(得分:1)

您想要了解的是Dependency Injection,它可以让您将所需的对象注入 User 对象的构造中。

# Your updated User class
class User {
    private $username;
    private $db

    public function __construct($db){
        $this->db = $db
    }

    public function get_last_visit(){
        return $this->db->get(
            'users',
            'last_visit',
            'username' => $this->username
        );
    }
}
# Instantiate your Database Wrapper
$db = new DatabaseWrapper();

# Instantiate your User object with the DatabaseWrapper injected
$john_doe = new User($db);

$john_doe->get_last_visit();

答案 1 :(得分:0)

由于范围问题,这是不赞成的。毫无疑问,您的函数和类中的变量不会直接与其各自区域之外的任何内容进行交互。否则你会有变量在整个地方发生碰撞。这就是为什么对象和方法通常会替换过去的过程代码。当您必须明确传递数据时,更容易跟踪程序中发生的情况,而不是依赖于各种$GLOBALS

我强烈建议您依赖注入数据库指针。这样您就不会继续重新创建连接,并且您的类和方法将变得与连接的方式无关。

class user{
    private $username;
    /** @var stdClass */
    protected $db;

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

    public function get_last_visit(){
        return $this->db->get(
            'users',
            'last_visit',
            'username' => $this->username
        );
    }
}
$user = new user($db);