PHP-mySQL数据库类 我看到了C++中的强大的OOP,所以我开始在PHP上读OOP。这让我想改造我的一个网站,这样它就可以使用OOP PHP来清理它现在所处的混乱局面。我已经知道OOP的基本概念,但我在应用它方面有点困难

PHP-mySQL数据库类 我看到了C++中的强大的OOP,所以我开始在PHP上读OOP。这让我想改造我的一个网站,这样它就可以使用OOP PHP来清理它现在所处的混乱局面。我已经知道OOP的基本概念,但我在应用它方面有点困难,php,mysql,oop,class,Php,Mysql,Oop,Class,到目前为止,我看到的所有使用OOP PHP的站点都有某种mySQL DB类。我可以肯定地看到它的好处(当你想访问数据库中的东西时,代码更干净),但我不完全确定如何设置我的。我想知道的是: 我应该做的第一件事是什么 从 磨碎?(这门课该怎么办 设置?背后的想法是什么 结构?它看起来像什么 什么时候会这样 在我的生活中应该有什么样的方法 DB类?(什么样的功能 我的DB类应该提供SQL吗 插入?SQL更新?普通ole'SQL 查询?这些数据应该是什么 方法返回?) 如何确定何时需要添加 一个新的课

到目前为止,我看到的所有使用OOP PHP的站点都有某种mySQL DB类。我可以肯定地看到它的好处(当你想访问数据库中的东西时,代码更干净),但我不完全确定如何设置我的。我想知道的是:

  • 我应该做的第一件事是什么 从
    磨碎?(这门课该怎么办 设置?背后的想法是什么 结构?它看起来像什么 什么时候会这样
  • 在我的生活中应该有什么样的方法 DB类?(什么样的功能 我的DB类应该提供SQL吗 插入?SQL更新?普通ole'SQL 查询?这些数据应该是什么 方法返回?)
  • 如何确定何时需要添加 一个新的课堂教学方法
  • 我应该如何在其他代码中使用这些方法

谢谢

如果您指的是连接到数据库、准备并运行查询的类,请使用(教程中的“try”)。如果您指的是一个(DAO),它是一个(或多个)类,可以作为一个和您的应用程序对象来使用,请尝试或模式。请注意,活动记录模式有点旧,有些人不喜欢它,因此关于PHP中活动记录的文章往往比较旧,有点过时

无论应用何种模式,类应该提供的四个基本操作是(CRUD)。创建和读取返回应用程序对象,更新和删除可以返回指示成功或失败的值

使用类非常简单:每当需要对象时,使用create或read而不是对象构造函数。何时使用更新或删除取决于您的业务逻辑。例如,您可能需要在处理对象时进行更新(即,当对象被销毁时)。更棘手的是对象或函数如何获得对DAOs的引用。阅读Martin Fowler关于几种不同方法的文章

进一步阅读:


有几种方法可以做到这一点,首先,您可以将系统“集成”到本机系统(如mysqli)中,或者使用驱动程序从头开始创建自己的系统/结构

对于第一种方法,您的应用程序有点有限,因为您必须遵守本机API的内部结构

我个人的方法通常是第二种,因为我可以创建一个基于驱动程序的系统,并根据主机操作系统和其他几个因素决定使用哪个本机系统

当为应用程序创建要运行的数据库API时,如果您不希望它专门用于该应用程序,您应该能够获取库并将其放入新项目中,并且一切都应按预期工作,因此将其抽象化是我们必须解决的第一个问题

下一个障碍是使代码具有可扩展性,编程世界发生了根本性的变化,因此我们应该为变化做好准备,尽管代码只能使用几年,但如果我们考虑这些年并做好准备,这将是有益的

想象一下,如果下周创建了一个新的数据库层,比当前集成到PHP中的mysql(i)层快50倍,那么您可能希望尽快切换到该api,在开发阶段考虑这些因素总是一个好主意

首先,我们应该确定结构,对于传统的抽象层,代码通常都构建在一个大类文件中,这可能是糟糕的编程,因为它应该分解为它的用途

我们应该分离类/对象,以便它们执行专门为其设计的任务

我们应该有一个全局“控制器”,它将是主数据库类,这将控制发送到子类和从子类发送的所有操作

我们将至少为PHP 5.3进行设计,因此让我们开始:

我倾向于创建一些最终结果是什么样的伪代码,这样我就能理解应该实现什么

$Connection = new DatabaseConnectionDetails(array(
    "hostname" => "localhost",
    "username" => "root",
    "password" => "n/a",
    "charset" => "UTF-8",
    "database" => "my_database",
    "driver" => "MySQL",
));

$Database = Database::getInstnace($Connection);

$Query = $Database->Query("SELECT * FROM {?:table} WHERE id = {?:id}",array(
    "table" => "posts",
    "id"    => 22
));

if($Query->Execute())
{
    $Results = $Query->GetResults();

    foreach($Results as $Result)
    {
         echo $Result->data; //trims, converts to int, returns;
    }
}
这就是我希望连接到数据库的方式,所以这就是我开始使用基类的方式

class Database
{
    private static $_DBInstance;

    public static function getInstance(IDatabaseConnectionDetails $ConnectionDetails)
    {
        if(self::$_DBInstance === null)
        {
            self::$_DBInstance = new Database($ConnectionDetails);
        }
        return self::$_DBInstance;
    }

    public function __construct(IDatabaseConnectionDetails $ConnectionDetails)
    {
        //We will come back to this.
    }
}
查看上面的类,您将看到,首先它有一个create实例(singleton),有助于在任何应用程序中使用数据库,您还将注意到,im专门定义了所需的参数

在整个抽象层中将上述因素保持在适当的位置将使生活更加轻松

让我来解释一下目录结构,您必须将下面的类分开

  • 数据库
    • 查询类
  • 接口
  • 司机
  • 助手
我会选择这样一种结构:

  • 包括
    • DBAL
      • Database.class.php
      • DatabaseConnectionDetails.class.php
      • 司机
      • 接口
      • 结果
如上所述,需要一个
IDatabaseConnectionDetails
接口,其目的是分离凭证和主数据库,因此
IDatabaseConnectionDetails
主要负责查看用户凭证

class DatabaseConnectionDetails implements IDatabaseConnectionDetails
{
    public $hostname = "localhost";
    public $username = "";
    public $password = "";
    public $charset = "UTF-8";
    public $driver = "mysqli";

    public function __construct($params)
    {
        //Set Params here
    }
}
上面提到了为配置创建类的美妙之处,即类的可扩展性,例如:

class MyCustomConfig extends DatabaseConnectionDetails
{
        public $hostname = "host.domain.tld";
        public $username = "my_other_user";
        public $password = "IJH87b&OTIT8fh";
        public $driver   = "mssql";
}
通过这种方式,当类被接口时,您可以将任何类发送到主数据库对象中,无论是自定义的还是非自定义的,因为接口允许您进行扩展

现在,对于所需的驱动程序,您应该注意每个驱动程序都应该是
interface IDatabaseDriver
{
    public function setConnectionDetails(IDatabaseConnectionDetails $ConnectionDetails);
    public function connect();
    public function escape($string);
    public function query($string);
    /*
       all the methods here that will allow the main class can access, such as:
       - next()
       - prev()
       - reset()
       ect ect
    */
}