gpt4 book ai didi

php - 动态创建数据库模型类

转载 作者:可可西里 更新时间:2023-11-01 01:07:54 25 4
gpt4 key购买 nike

我正在尝试改进我正在使用的方法,以便在我构建的轻型框架中对事务进行数据库处理。

理解问题的信息:

这是我编写的一个类(其中 connect.php 加载数据库凭据;PHP PDO 的包装器,存储在 $db 中;和 Base.php):

<?php
require_once('connect.php');

class Advertiser extends Base
{
public static function getByID($id)
{
global $db;
$sql = "SELECT * FROM advertiser WHERE advertiserid=?";
$values = array($id);
$res = $db->qwv($sql, $values);

return Advertiser::wrap($res);
}

public static function add($name)
{
$adv = new Advertiser(null, $name);
$res = $adv->save();

return $res;
}

public static function wrap($advs)
{
$advList = array();
foreach( $advs as $adv )
{
array_push($advList, new Advertiser($adv['advertiserid'], $adv['name']));
}

return Advertiser::sendback($advList);
}

private $advertiserid;
private $name;

public function __construct($advertiserid, $name)
{
$this->advertiserid = $advertiserid;
$this->name = $name;
}

public function __get($var)
{
return $this->$var;
}

public function save()
{
global $db;
if( !isset($this->advertiserid) )
{
$sql = "INSERT INTO advertisers (name) VALUES(?)";
$values = array($this->name);
$db->qwv($sql, $values);

if( $db->stat() )
{
$this->advertiserid = $db->last();
return $this;
}
else
{
return false;
}
}
else
{
$sql = "UPDATE advertisers SET name=? WHERE advertiserid=?";
$values = array ($this->name, $this->advertiserid);
$db->qwv($sql, $values);

return $db->stat();
}
}
}
?>

如您所见,它具有相当标准的 CRUD功能(编辑:好的,所以在此实现中只有 CRU)。有时,我会通过添加更多功能来扩展这样的类,这正是这些类的目的。例如,我可能会向此类添加以下函数(假设我向数据库添加了一列 isBanned):

public static function getBanned()
{
global $db;
$sql = "SELECT * FROM advertiser WHERE isBanned=1";
$res = $db->q($sql);

return Advertiser::wrap($res);
}

问题:

我如何创建一个 catchall 类,该类也将在存在和必要时加载自定义模型类?

例如,如果我写下面的代码:

$model = new Catchall();
$banned = $model->Advertiser::getByID(4);

我希望我的 catchall 类修改它的查询,以便所有对表/列的引用都是我选择的任何名称(Advertiser,在本例中),但小写。

此外,如果我想创建一个像我上面写的那样的自定义函数,我希望我的 catchall 类确定它的路径中存在一个文件(当然是以前定义的),其名称是我已经指定(Advertisers.php,在本例中)并加载它。

Advertisers.php扩展 Catchall 并且只包含我的自定义函数。

通过这种方式,我可以拥有一个适用于所有 CRUD 函数的 Catchall 类,并且能够根据需要轻松扩展任意类。

  1. 我需要了解哪些想法/概念才能做到这一点?
  2. 我在哪里可以找到这方面的示例,无需深入研究大量 CodeIgniter 或 Zend 源代码
  3. 我想做的事情叫做

最佳答案

一般资料:我会调查Doctrine2有关他们如何在 PHP 中制作 ORM 的示例。他们使用标记语言中的映射来表示:这个表有这些这种类型的列。此外,虽然不在 PHP 中,但 Django ORM非常容易使用和理解,花 20 分钟左右的时间完成该教程会让您大开眼界,发现一些巧妙的可能性。 (对我有用)

快速搜索“php active record lightweight”会返回几个有趣的示例,这些示例可能会让您走上正确的道路。

PHP 想法:我会研究 php 中神奇的 getter 和 setter,__GET 和 __SET,它们可以让您在对象上设置值,而不必为每个对象的每个字段创建 getter/setter table 。您可以制作一个 __SET 来确保设置字段是该表中的一个字段,并在下次保存该对象时将其添加到“要更新的字段”列表中。但是,从长远来看,这并不是一个好主意,因为它很快就会失控,而且很脆弱。

建议:最后,我曾在一家公司工作,该公司使用的系统看起来几乎与此一模一样,我可以毫不含糊地说,你不想尝试长期扩展。像这样的系统(事件记录模式)可以节省大量的前期时间,因为不必编写查询和其他东西,但是如果你想开始单元测试业务逻辑 对象类。

例如,无法模拟/依赖注入(inject)静态 GetById 方法(它基本上是一个全局方法),所以每次在代码中调用它时,代码都会转到真实数据库并返回一个真实对象.不需要像这样编写太多代码就可以创建一个几乎无法测试、困惑且与数据库紧密耦合的系统。

虽然它们的执行速度可能比您上面的代码慢一点,但如果您计划在相当长的时间内使用它,请尝试研究 ORM 工具。

编辑它叫做Active Record。

关于php - 动态创建数据库模型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com