1

我亲身体验了 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,一旦读取它就会得到输出?

使用前者,主应用程序控制器可以精确控制输出的时间,而不会完全控制显示器的一时兴起。更不用说,所有要调用的显示函数列表(上面)不能真正从显示文件中执行,除非它们被传递。使用后一种方法,我得到了在实际 HTML 中执行 HTML 的好处,而不是执行巨大的 PHP 字符串块。另外,我可以只包含文件来运行它,而不是调用函数。所以我猜用这种方法,文件就像一个函数。

请问有什么意见或建议吗?

4

3 回答 3

1

通过使用输出控制函数,您可以获得两者的好处,获取 HTML 字符串,同时在 PHP 代码中嵌入 HTML:

从 PHP 手册 @ http://www.php.net/manual/en/ref.outcontrol.php

<?php

function callback($buffer)
{
  // replace all the apples with oranges
  return (str_replace("apples", "oranges", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush();

?>
于 2009-09-04T01:38:08.453 回答
1

让我的所有显示函数都返回它们生成的 HTML 会更好吗,这样主控制器就可以回显 $page; 或者显示文件应该使用 PHP 之外的原始 HTML,它一被读取就得到输出?

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

所以:

<h1> <?= $myHeading; ?> </h1>

比以下更清楚:

echo "<h1>$myHeading</h1>";

一个甚至更多:

echo heading1($myHeading); //heading1() being an hypothethical user defined function.

基于此,我认为最好在视图中使用 HTML 并使用 php.ini 打印适当的动态字段。

为了更好地控制输出,您可以使用: ob_start 作为 gurunu 推荐的。

您当然可以使用任何几个 php MVC 框架。我最喜欢的,现在是:Solarphp

但是Zend FrameworkCakephp也可以帮助你。

最后,如果您不想使用任何框架,您仍然可以使用一个非常苗条的模板引擎:phpSavant。这将为您在开发视图时省去一些麻烦。th

于 2009-09-04T01:55:45.063 回答
0

首先缓冲一切。然后在脚本末尾使用解析器替换标签。

<?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;

?>

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

我是否提到过在“回显”之前在变量中缓冲输出的好处?http://thephpcode.blogspot.com/2009/02/php-output-buffering.html

于 2009-09-05T15:17:05.483 回答