在类函数中使用html有什么问题吗?我在DOM中调用它,所以不需要返回字符串。
public function the_contact_table(){
?>
<div>
some html here
</div>
<?php
}
当我确实需要字符串时,我也会使用这种方法吗?有没有更好的方法,或者这是相对标准的?
public function get_single(){
ob_start();?>
<div class='staff-member single'>
<div class='col left'>
<div class='thumbnail'>
thumbnail
</div>
<?php $this->the_contact_table(); ?>
</div>
<div class='col right'>
</div>
</div>
<?php
$content = ob_get_contents();
ob_end_clean();
return $content;
}
更新
我应该解释一下我为什么这么做。我正在制作一个Wordpress插件,想要控制一个post-types输出。所以我用的是下面的过滤器
public function filter_single($content){
global $post;
if ($post->post_type == 'staff-member') {
$sm = new JM_Staff_Member($post);
$content = $sm->get_single();
}
return $content;
}
如您所见,I必须向wordpress核心
如果要将长字符串存储到变量中,则应该使用HEREDOC而不是输出缓冲。它看起来像这样:
$content = <<<EOD
content here
EOD;
EOD
可以是任何东西,但请注意两件重要的事情:
- 它前面不能有任何空白,而且必须在自己的行上
- 它不应该是可以在您的内容中找到的字符串
如果您使用的是PHP>=5.3,那么您应该使用NOWDOC,它不会解析文档中的变量(除非您需要)。与NOWDOC语法的唯一不同之处在于,sentinel用引号括起来:
$content = <<<'EOD'
content here
EOD;
我之所以偏离输出缓冲区,是因为它可以防止服务器将发送到客户端的数据分块。这意味着请求看起来会更慢,因为内容不是逐渐发送到客户端并显示的,而是被迫同时发送的。当函数不小心echo
数据,而不是为特定需要它的应用程序返回它或工具时,输出缓冲是一种破解方法。我还可以想象,如果你使用输出缓冲(因为它涉及函数调用),而不是将字符串HEREDOC化为变量或包含视图,你会在执行时间上受到影响。
现在,为了回答它是否合适的问题,我想说,在MVC应用程序中,所有HTML和其他内容都应该包含在自己的视图中。然后,控制器可以调用视图来显示自己,并且不必担心知道显示视图所涉及的代码。您仍然可以将信息(如标题、作者、标签数组等)传递给视图,但这里的目标是将内容与逻辑分离。
也就是说,Wordpress模板和代码一开始看起来很草率,如果没有实现MVC的话,也很松散,所以如果为此创建视图的工作量太大,我想说这种草率会符合WP的风格。
将实际的"视图"放在PHP类文件中会疏远前端开发人员,这不是一个好的做法。当我刚开始使用PHP时,这是我最大的问题之一,因为我想在类中动态创建内容。这是一个好主意,但你希望以一种让团队中的许多成员尽可能顺利地合作的方式来做这件事;]。
您可能应该将内容放在一个名为"staffmembersingle.php"的单独文件中,然后在函数中调用该文件
public function get_single(){
ob_start();
require_once('views/staff-member-single.php');
$content = ob_get_contents();
ob_end_clean();
return $content;
}
不过,你通常会将其重构为一个可重用的方法,所以它看起来有点像。。
public function get_single()
{
$string = $this->render_view_as_string('satff-member-single');
return $string;
}
public function render_view($view)
{
require('views/'.$view.'.php');
}
public function render_view_as_string($view)
{
ob_start();
$this->render_view($view);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
我认为只将PHP用于应用程序的逻辑并将一些数据传输到视图层(模板引擎)是一种很好的做法。根据这一点,出现了一些类似MVC的模式。