如何在 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 中使用多个类的主要内容,如果未能解决你的问题,请参考以下文章

java 父类如何在运行期动态获取子类类名

外键和引用类如何在 Hibernate 实体中一起存在?

idea java中Jformdesigner自动生成的类如何在public static void main(String[] args)}中引用

MATLAB中如何使用KNN对数据进行分类?

多个 Redis 数据库的意义何在?

什么是NLP?