我如何在PHP中使用多个类

时间:2013-12-18 20:56:24

标签: php mysql class oop mysqli

我对php中的oop非常新,到目前为止我正在使用我在一个php文件中创建的多个类,例如:

class Style {
//stuff
}
class User {
//other stuff
}

还有更多,但我在如何连接到这些类中的mysql时遇到问题,如果我使用$db = new Mysqli();我将如何从内部类中进行查询?如果我正在尝试制作我自己的连接器类,那该怎么办:

class Connection extends mysqli {
    public function __construct($host, $user, $pass, $db) {
    parent::__construct($host, $user, $pass, $db);
    if (mysqli_connect_error()) {
        die('Connect Error (' . mysqli_connect_errno() . ') '
        . mysqli_connect_error());
        }
    }       
}

如何在不同的课程中进行查询?或者在php中正确使用oop的更好方法是什么?有多个类来组织不同的代码部分? 任何帮助或提示将不胜感激,谢谢。那么使用PDO呢?这会让一切变得更轻松吗?

3 个答案:

答案 0 :(得分:6)

class Style {
    public function __construct($conn) {
        $this->conn = $conn;
        //use $this->conn in the class
    }
}

$db = new Mysqli();
$style = new Style($db);

我认为第一个示例是首选方法,但是您可以创建一个简单的注册表类并使用它来存储$ db对象等。

如果可能,我可能会使用PDO,但这并不能解决这个问题。

答案 1 :(得分:0)

由于您正在扩展mysqli类,因此您将可以访问这些函数,就像您自己实例化该类一样(只要这些函数不是私有的)。有些人(包括我自己)会使用数​​据库连接在自己的自定义类中实例化数据库连接,然后将该类注入需要它的类中。

class MyDatabase {

    private $this->dbi;

    public function __construct() {}

    public function connectDB($host, $user, $pass, $db)) {
        //You can do this in the constructor too, doesn't have to be its own function
        $this->dbi = new mysqli($host, $user, $pass, $db);
    }

    public function getDBI() {
        return $this->dbi;
    }
}

您可以将所需的所有函数添加到您自己的类(或扩展类)中,您也可以拥有任何需要数据库扩展您的DB类的类。但这并不是首选(每个类都有不同的db类/连接)。最简单的可能是将您的数据库连接导入您的类。通过构造函数或其他函数;

class MyClass {

    private $this->database;

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

    public function query($q) {
        //Of course, clean your data first, and best practices use prepared statements
        $result = $this->database->query($q);
        return $result;
    }
}

然后建立数据库连接并将其注入您的班级。

$db = new MyDatabase();
$db->connectDB('localhost', 'username', 'password', 'mydb');

$class = new MyClass($db);
$resultSet = $class->query("SELECT * FROM MyTable");  //Obviously anything the user could add here is to not be trusted.

答案 2 :(得分:-2)

使用PDO将为您提供许多功能和灵活性,并且内置了许多驱动程序。 在这里做你想做的是一个样本: 步骤1 : 创建一个将处理数据库的Main类:

class app extends PDO { 
   protected $database_hostname = "localhost";
    protected $database_username = "root";
    protected $database_password = "";
    protected $database_name = "testdb";
    protected $database_type = "mysqli";

    public function __construct() {

        try {
            parent::__construct($this->database_type . ':host=' . $this->database_hostname . ';dbname=' . $this->database_name, $this->database_username, $this->database_password, array(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION));
        } catch (PDOException $e) {
            echo 'ERROR: ' . $e->getMessage();
        }
    } 
}

第2步: 那么你需要初始化一个globale变量作为你的数据库:

$db= new app() ; 

第3步: 包含一个局部变量来处理其他类中的数据库:

class User{
public $db ; 
}

第4步: 在其他类的构造函数(用户为例)中,您需要通过引用传递局部变量到globale变量:

    class User{
       public $db ; 
       public function __construct(){   
            global $db;
            $this->db =& $db;
       }
    }

第5步: 然后,如果你想从类中执行一个请求,你可以通过局部变量来执行:

$this->db->query("SELECT * FROM user"); 

,只需使用:$db->query("SELECT * FROM user");

从外面看

我希望有所帮助!