在MVC或MVP(PHP)中实现视图

在MVC或MVP(PHP)中实现视图,php,model-view-controller,implementation,mvp,Php,Model View Controller,Implementation,Mvp,我亲身体验过PHP的丑陋所能造成的恐怖和枪击。我正在进行我的下一个项目(你可能想知道为什么我不只是在切换语言,但这不是我来这里的原因),我决定这次尝试做对,或者至少做得更好 我已经定义了一些模型,并且开始使用主控制器。我在如何实现视图的决策上遇到了困难。到目前为止,主控制器可以得到要调用的显示函数列表,然后它可以通过一次调用输出整个页面。它看起来像: function Parse_Body() { foreach ($this->body_calls as $command

我亲身体验过PHP的丑陋所能造成的恐怖和枪击。我正在进行我的下一个项目(你可能想知道为什么我不只是在切换语言,但这不是我来这里的原因),我决定这次尝试做对,或者至少做得更好

我已经定义了一些模型,并且开始使用主控制器。我在如何实现视图的决策上遇到了困难。到目前为止,主控制器可以得到要调用的显示函数列表,然后它可以通过一次调用输出整个页面。它看起来像:

function Parse_Body()  
{  
    foreach ($this->body_calls as $command)  
    {  
        $call = $command['call'];  
        if (isset($command['args'])) $call($command['args']);  
        else $call();  
    }  
}
我的困境是:

让我的所有显示函数返回它们生成的HTML是否更好,这样主控制器就可以
echo$page
或者显示文件应该使用PHP之外的原始HTML,PHP在读取后立即获得输出

有了前者,主应用程序控制器可以精确地控制输出的时间,而无需完全控制显示器的突发奇想。更不用说,所有这些要调用的显示函数列表(如上)都不能从显示文件中执行,除非它们被传递出去。使用后一种方法,我可以在实际的HTML中使用HTML,而不是使用巨大的PHP字符串块。另外,我可以只包含文件来运行它,而不是调用函数。所以我想用这种方法,一个文件就像一个函数


请提供任何输入或建议?

通过使用输出控制函数,您既可以获得HTML字符串,又可以在PHP代码中嵌入HTML,这两种功能都可以发挥作用:

从PHP手册@中:


这就像拿苹果和桔子做比较

有我所有的朋友会更好吗 显示函数返回它们所使用的HTML 生成,以便主控制器 可以只回显$page;还是应该 显示文件在外部使用原始HTML PHP,它在运行时立即获得输出 阅读

php的优点之一是其处理与输出类似:

因此:

基于此,我认为最好是使用HTML,并且只需使用PHP.< /P>打印适当的动态字段。 为了让芬纳控制输出,您可以使用:ob_start作为古鲁努的建议

当然,您可以使用几种php MVC框架中的任何一种。 我现在更喜欢的是:

但我也可以帮你

最后,如果您不想使用任何框架 您仍然可以使用非常苗条的模板引擎:。 这将为您的视图开发节省一些麻烦。
首先缓冲一切。然后在脚本末尾使用解析器替换标记

<?php

$page_buffer = '';

function p($s){
   global $page_buffer;
   $page_buffer .= $s;
}

$page_buffer = str_replace(
     array('<$content$>','<$title$>'),
     array($pagecontent,$pagetitle),
     $page_buffer);

echo $page_buffer;

?>

以这种方式实现输出缓冲和视图模型


我有没有提到在“回显”之前在变量中缓冲输出的好处

只需开始一行,用4个空格设置代码格式。我试过了,但屡次失败。也许是因为我使用了实际的代码标记?但PHP小组再次建议删除短标记。因此,考虑再次使用,因为您可能需要在不久的将来对其进行更改。使用建议的框架之一(ZF、Solar)可能是一个很好的做法。Mauris您可以指出“建议删除短标签”。人们建议不要使用它们,因为在某些php安装中,它们在php.ini中被禁用,但我喜欢在视图/模板中使用它们。这比写容易:在几个地方。而且,我相信建议是反对PHP ASP风格的短标记(and),而不是所有的短标记(例如and)?
<h1> <?= $myHeading; ?> </h1>
echo "<h1>$myHeading</h1>";
echo heading1($myHeading); //heading1() being an hypothethical user defined function.
<?php

$page_buffer = '';

function p($s){
   global $page_buffer;
   $page_buffer .= $s;
}

$page_buffer = str_replace(
     array('<$content$>','<$title$>'),
     array($pagecontent,$pagetitle),
     $page_buffer);

echo $page_buffer;

?>