简短的回答是:是的PHP.
(注意,它不是原始论文中描述的MVP,而是网络的变体)
MVC和MVP之间的区别在于,视图完全被动并且不知道模型层.在MVC中,它不是被动的并且意识到模型层.在适当的MVP中,View类(如果是)也不应该实现构造函数.
MVP的典型示例包括以下部分:
>数据访问层(DataMappers,ORM等)
>业务逻辑(如验证和计算)
>被动视图类(它可能是一个模板,但坚持使用类更好)
>连接模型和视图的演示者
关于如何使用PHP实现Model-View-Presenter的示例
注意:实际场景中的模型不是类,而是抽象层,它包含许多用于处理应用程序逻辑的类.我将它称为“模型”用于演示目的.
class Model
{
public function getSomeStuff()
{
return array('foo' => 'bar');
}
}
class View
{
public function render($path, array $vars = array())
{
ob_start();
extract($vars);
require($path);
return ob_get_clean();
}
}
class Presenter
{
private $model;
private $view;
public function __construct(Model $model, View $view)
{
$this->model = $model;
$this->view = $view;
}
public function indexAction()
{
$data = $this->model->getSomeStuff();
// Variables are set now, render the HTML
// And returns as a string
return $this->view->render('path/to/template.phtml', $data);
}
}
文件:template.phtml
...<?php foreach($vars as $key => $value): ?>
<?php echo $key; ?> : <?php echo $value; ?>
用法是:
$model = new Model();
$view = new View();
$presenter = new Presenter($service, $view);
echo $presenter->indexAction();
请注意,这是一个非常简化的示例.在实际场景中,任何基于MVP的应用程序也应该实现以下内容:路由器,SPL类自动加载器.