【问题标题】:How do I use multiple classes in PHP如何在 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 的完整版本,但它可以帮助您支持多个供应商,而无需为每个供应商编写一个类。

标签: php mysql class oop mysqli


【解决方案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");

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 2012-10-18
      相关资源
      最近更新 更多