// Модель пользователя
class User
{
// имена тех аттрибутов, которые может содержать в себе объект
private $model_attributes = array();
// данные пользователя
private $data;
public function __construct()
{
$this->model_attributes = array('user_name', 'user_age', 'user_sex');
}
public function __set($key, $value)
{
if (in_array($key, $this->model_attributes))
{
$this->data[$key] = $value;
}
}
public function __get($key)
{
return isset($this->data[$key]) ? $this->data[$key] : null;
}
public function getAttributes()
{
return $this->data;
}
public function getObjectById($id)
{
if ($this->data == null)
{
// поскольку объекта БД и самой БД в примере не предусмотрено,
// мы делаем заглушку получения результата:
// $res = $db->query('SELECT '.implode(', ', $this->model_attributes).
// ' * FROM users WHERE id_user = ?', $id);
// $this->data = $res->fetch_assoc();
// Исключительно для тестирования.
$this->data = array('user_name' => 'Вася', 'user_age' => 15, 'user_sex' => 'M');
}
return $this->data;
}
}
// Оболочка $_REQUEST
class Request
{
private $data;
public function __construct($request)
{
$this->clear($request);
}
// Очищаем request от пробелов и слэшей.
private function clear($in)
{
foreach ($in as $key => $value)
{
if (is_array($value)) {
$this->clearREQUEST($in[$key]);
}
else
{
$value = trim($value);
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
$in[$key] = $value;
}
}
$this->data = $in;
}
public function __get($key)
{
return isset($this->data[$key]) ? $this->data[$key] : null;
}
public function __set($key, $value)
{
$this->data[$key] = $value;
}
public function __isset($key)
{
return isset($this->data[$key]);
}
}
class ViewController
{
private $model;
private $view;
private $request;
private $error;
private $bufer; // всё, что потом пойдет в view в качестве данных для вывода
public function __construct(&$model)
{
$this->model = $model;
}
public function run(&$request, &$view)
{
$this->request = $request;
$this->view = $view;
if (!$request->__isset(id_user))
{
$this->bufer['error'] = 'Не указан идентификатор пользователя!';
}
else
{
$user_data = $this->model->getObjectById($request->id_user);
if (!$user_data)
{
$this->bufer['error'] = 'Пользователь с ID '.$request->id_user.' не найден';
}
else
{
foreach ($user_data as $key => $value)
{
$this->bufer[$key] = $value;
}
}
}
// отдаем всё в view
foreach ($this->bufer as $key => $value)
{
$this->view->$key = $value;
}
}
}
class View
{
private $tpl; // путь до шаблона
private $data = array(); // данные для подстановки
private $out; // скомпилированный шаблон
public function __construct($tpl)
{
$this->tpl = $tpl;
}
public function __get($key)
{
return isset($this->data[$key]) ? $this->data[$key] : null;
}
public function __set($key, $value)
{
$this->data[$key] = $value;
}
public function display()
{
extract($this->data);
ob_start();
include($this->tpl);
$this->out = ob_get_contents();
ob_end_clean();
return $this->out;
}
}
$_REQUEST = array('id_user' => 123);
$request = new Request($_REQUEST);
$ctrl = new ViewController(new User());
$view = new View('template.tpl');
$ctrl->run($request, $view);
echo $view->display();