如何在 PHP 中使用多个类
Posted
技术标签:
【中文标题】如何在 PHP 中使用多个类【英文标题】:How do I use multiple classes in PHP 【发布时间】:2014-01-07 05:24:59 【问题描述】:我对 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 怎么样?这会让一切变得更容易吗?
【问题讨论】:
使用像Symfony 这样的框架。它们正好解决了这类问题,因此您可以专注于手头的任务。 ;-) PDO 是一个与多个数据库供应商有接口的 API。 MySQLi 只能访问 MySQL 数据库,但 PDO 可以访问 MySQLi、MSSQL、SQLite 等。它不是常规数据库驱动 API 的完整版本,但它可以帮助您支持多个供应商,而无需为每个供应商编写一个类。 【参考方案1】:class Style
public function __construct($conn)
$this->conn = $conn;
//use $this->conn in the class
$db = new Mysqli();
$style = new Style($db);
我认为第一个示例是首选方法,但是您可以创建一个简单的注册表类并使用它来存储 $db 对象等。
如果可能的话,我可能会使用PDO
,但这并不能解决这个问题。
【讨论】:
这是否意味着我必须将连接添加到我创建的每个类?除了这样做,还有其他方法吗?我可以在全球范围内访问的东西? 我认为依赖注入是首选方法,但您可以使用注册表。 您可以使用 global 关键字来访问全局 db 变量,但是一旦项目增长,这不是一个很好的解决方案。使用构造函数将提供更好的控制和可追溯性,并且更容易寻找错误。 @AbraCadaver 考虑到您的代表,这样做感觉不对。认为通知更好。【参考方案2】:由于您正在扩展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 类。但这并不是真正的首选(每个类都有不同的数据库类/连接)。最简单的可能是将您的数据库连接导入您的班级。通过构造函数或其他函数;
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.
【讨论】:
【参考方案3】:使用 PDO 将为您提供许多功能和灵活性,并且它内置了许多驱动程序。 做你想做的事是一个样本: 第1步 : 创建一个主类来处理你的数据库:
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 步: 那么你需要初始化一个全局变量作为你的数据库:
$db= new app() ;
第 3 步: 在其他类中包含一个局部变量来处理数据库:
class User
public $db ;
第 4 步: 在其他类的构造函数中(例如 user ),您需要通过引用 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");
希望对您有所帮助!
【讨论】:
以上是关于如何在 PHP 中使用多个类的主要内容,如果未能解决你的问题,请参考以下文章
idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用