4

PSR-2没有提及任何适用于在 HTML 模板中使用内联 php 标签的内容,但该php-cs-fixer工具似乎有一个标准。

这是我的模板文件,在运行之前php-cs-fixer

<nav>
    <ul>
        <li>
            <a href="#">Link</a>
<?php
if (! empty($subnav)) {
?>
            <ul class="subnav">
<?php
    foreach ($subnav as $link) {
?>
                <li><?=$link?></li>
<?php
    }
?>
            </ul>
<?php
}
?>
        </li>
        <li><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
    </ul>
</nav>

运行后php-cs-fixer fix views/ui/nav.php --level=psr2

<nav>
    <ul>
        <li>
            <a href="#">Link</a>
<?php
if (! empty($subnav)) {
    ?>
            <ul class="subnav">
<?php
    foreach ($subnav as $link) {
        ?>
                <li><?=$link?></li>
<?php

    }
    ?>
            </ul>
<?php

}
?>
        </li>
        <li><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
    </ul>
</nav>

这看起来不对,所以我一定遗漏了一些东西。

  • 是否有正确的方法来编写符合 PSR-2 的内联 PHP?
  • 将 PHP 的替代语法用于控制结构会有什么问题吗?再一次,在 PSR-2 中没有提及,php-cs-fixer它们似乎没有任何问题,但由于某种原因,它们感觉有点脏!
4

1 回答 1

2

根据要求:作为答案发布的评论:

PSR 仅适用于 PHP 代码,它没有关于内联 HTML 的任何内容,因为 HTML 根本不是 PHP。

您获得的输出仅添加空格,根据标准,应该有空格 - 开头后的新行{ - 之后的行{使用 4 个空格缩进 - ...

这就是为什么:

<?php
if(!empty($subnav)){//note no spaces
?>

将改为:

<?php
if (!empty($subnav)) {
    ?>

在您的foreach代码中,您会注意到所有内容都已经缩进了 4 个空格,因为代码在if块内。

无论哪种方式,如果您要将 PHP 混合到标记中,最好使用替代的、更模板友好的语法:

<?php
if (!empty($subnav)):
?>
//markup
<?php
    foreach ($subnav as $link):
        //do stuff
?>
//markup
<?php
    endforeach;
endif;
?>

请注意,结束标签的缩进可能仍会被 php-cs-fixer 更改。end<blockName>;也许像这样内联:

<?php endforeach; ?>
于 2015-01-15T11:05:11.507 回答