Я пытаюсь улучшить метод, который я использую для транзакций базы данных в легком фреймворке, который я построил.
Информация, чтобы понять вопрос:
Вот класс, который я написал (где 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 ( Edit : Хорошо, так что только CRU, в этой реализации). Иногда я расширяю такой класс, добавляя больше функций, для которых и предназначены эти классы. Например, я мог бы добавить следующую функцию в этот класс (при условии, что я добавлю столбец isBanned
в базу данных):
public static function getBanned()
{
global $db;
$sql = "SELECT * FROM advertiser WHERE isBanned=1";
$res = $db->q($sql);
return Advertiser::wrap($res);
}
Вопрос:
Как я могу создать универсальный класс, который также будет загружать пользовательские классы моделей, когда они присутствуют и необходимы?
Например, если я напишу следующий код:
$model = new Catchall();
$banned = $model->Advertiser::getByID(4);
Я бы ожидал, что мой класс catchall изменит свои запросы так, чтобы все ссылки на таблицы / столбцы были такими, какие я выбрал (* в нашем случае Advertiser
), но в нижнем регистре.
Кроме того, если бы я хотел создать пользовательскую функцию, подобную той, которую я написал выше, я бы ожидал, что мой класс catchall определит, что файл существует в его пути (ранее определенном, конечно) с именем, которое я имею указан (Advertisers.php
, в данном случае) и загрузите его.
Advertisers.php
будет extends Catchall
и будет содержать только мои пользовательские функции.
Таким образом, я мог бы иметь один класс Catchall, который работал бы для всех функций CRUD, и иметь возможность легко расширять произвольные классы по мере необходимости.
- Какие идеи / концепции мне нужно понять, чтобы сделать это?
- Где я могу найти примеры этого уже в дикой природе, , не копаясь в большом количестве исходного кода CodeIgniter или Zend ?
- Что я пытаюсь сделать называется ?