避免在每个函数中调用Database类

时间:2017-05-10 18:51:28

标签: php mysql oop

我正在尝试学习OOP php,当我正在开发一个登录/注册系统时,我注意到我在Users类的每个函数中都调用了数据库clase。

例如,像这样:

<?php

class Users {
    public function signUp($username, $email, $password){
        $db = new Database;
        $dbh = $db->connect();

        $sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";

        try {
            $query = $dbh->prepare($sql);
            $query->execute(array($username, $email, $password));

            echo 'succ';
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

基本上,在没有复制整个文件的情况下,我有一些与数据库一起工作的函数,在每一个函数中我都要调用这两行:

$db = new Database;
$dbh = $db->connect();

所以我在互联网上查找了一下spl_autoload_register。它在大多数情况下工作得很好,但我似乎无法像这样替换上面的两行:

$db = new Database;
$dbh = Database::connect();

因为我从我的数据库类中得到了另一个错误:

  

在D:\ xampp \ htdocs \ PHP中不在对象上下文中时使用$ this   第24行的OOP \ customSystem \ Classes \ Class.Database.php

第24行是此函数的返回

public function connect(){
        return $this->conn; 
    }

我不知道现在要做什么,但它也不会在每个函数中调用Database类来解决我的初始问题。那么,我需要做什么?

2 个答案:

答案 0 :(得分:1)

您应该将DB类作为依赖项传递。

看起来应该是这样的

class Users {
    private $dbh;

    public function __construct(\PDO $dbh) 
    {
        $this->dbh = $dbh;
    }     

    public function signUp($username, $email, $password)
    {
        $sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";

        try {
            $query = $this->dbh->prepare($sql);
            $query->execute(array($username, $email, $password));

            echo 'succ';
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }
}

此方法允许您将相同的 PDO实例传递给所有需要它的类。您还可以使用工厂来进一步改进代码,该工厂负责创建所有需要PDO作为依赖关系的类,如this answer中所述。

答案 1 :(得分:-1)

当您静态调用方法Database::connect();时,您无法引用$this $this是对您对象的现有实例的引用。 因此,当您通过new Database()创建新实例时,可以在Database类方法中使用$this指针。

了解有关静态事物的更多信息并尝试使用此功能:

class Database
{
    private static $instance = null;
    private static $conn = null;

    private function __construct()
    {
        try {
            $dbh = new PDO(DB_SOCKET_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8', DB_USER, DB_PASSWORD);
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$conn = $dbh;
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

    private function getDbConnection()
    {
        return self::$conn;
    }

    public static function connect()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance->getDbConnection();
    }
}

// how to use it? for eg.
$sql = 'INSERT INTO users (username, email, password) VALUES (?, ?, ?)';
$query = Database::connect()->prepare($sql);
$query->execute(array($username, $email, $password));

对不起任何错误,但我写的很快,没有测试它 我希望它有用