在类函数中使用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插件,并希望控制一个帖子类型输出。所以我使用的是如下过滤器
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;
}
正如您所看到的,我必须将字符串返回到wordpress核心
答案 0 :(得分:4)
如果要将长字符串存储到变量中,则应使用HEREDOC而不是输出缓冲。它看起来像这样:
$content = <<<EOD
content here
EOD;
EOD
可以是任何东西,但请注意两件重要的事情:
如果你使用PHP&gt; = 5.3,那么你应该使用NOWDOC,它不解析doc中的变量(除非你需要这个)。唯一与NOWDOC语法不同的是,标记用引号括起来:
$content = <<<'EOD'
content here
EOD;
我偏离输出缓冲的原因是它阻止服务器分块发送到客户端的数据。这意味着请求看起来会变慢,因为不是逐步将内容发送到客户端并显示,而是强制一次性发送。对于函数不小心echo
数据而不是返回它的情况或某些具有特定需求的应用程序的工具,输出缓冲是一种破解。我还想象一下,如果使用输出缓冲(因为它涉及函数调用)而不是将字符串HEREDOCing到变量或包含视图,那么你的执行时间会受到影响。
现在回答关于它是否合适的问题,我想说在MVC应用程序中,所有HTML和其他内容都应包含在自己的视图中。然后控制器可以调用视图来显示自己,而不必担心知道显示视图所涉及的代码。您仍然可以将信息(如标题,作者,标记数组等)传递给视图,但此处的目标是将内容与逻辑分开。
也就是说,Wordpress模板和代码看起来很草率,如果没有完全实现MVC那么松散,所以如果为此创建一个视图的工作太多,我会说这种风格适合WP的风格。
答案 1 :(得分:4)
关于通过在PHP类文件中放置实际上是“视图”的内容来疏远前端开发人员的事实,这不是一个好习惯。当我第一次开始使用PHP时,这是我最大的问题之一,就是我想在类中动态创建内容。这是一个好主意,但您希望以一种允许团队中的许多成员尽可能顺利地协同工作的方式来实现;]。
您应该将内容放在名为“staff-member-single.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;
}
答案 2 :(得分:2)
我认为将PHP仅用于应用程序逻辑并将一些数据传输到视图层(模板引擎)是一种好习惯。根据这一点,有一些模式,如MVC。