我对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呢?这会让一切变得更轻松吗?
答案 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");
我希望有所帮助!