我可以在 PHP 中使用散列符号(#)进行注释吗?

我从未见过 PHP 文件使用散列(#)进行注释。但是今天我意识到我真的可以!我想每个人都使用 //是有原因的,所以我来了。

除了个人喜好之外,是否有任何理由使用 //而不是 #来评论?

33480 次浏览
<?php
echo 'This is a test'; // This is a one-line C++ style comment
/* This is a multi-line comment.
Yet another line of comment. */
echo 'This is yet another test.';
echo 'One Final Test'; # This is a one-line shell-style comment
?>

RTM

PHP 的文档描述了注释的不同可能性

但是它并没有说明“//”和“ #”之间的区别。所以不应该有技术上的区别。PHP 使用 C 语法,所以我认为这就是大多数程序员使用 C 风格注释“//”的原因。

2021年更新: PHP8中,这两个字符是不一样的。序列 #[用于属性。(感谢 I336的评论)

原答案:

问题 在 PHP 中对单行注释使用“ #”和“//”是否有 < strong > 之间的区别?的答案是 没有

没有区别。通过查看 PHP 源代码的解析部分,“ #”和“//”由相同的代码处理具有完全相同的行为。

PHP 5.3不推荐使用带有“ #”的注释。所以总是使用//或/.../

有人可能认为,注释的 #形式主要是为了使用熟悉的“ shebang”(# !)创建一个 shell 脚本注释。在下面的脚本中,PHP 应该忽略第一行,因为它也是一个注释。例如:

#!/usr/bin/php
<?php


echo "Hello PHP\n";

如果你把它存储在一个可执行文件中,你就可以在这样的终端上运行它

./hello

输出是

Hello PHP

然而 ,这个推理是不正确的,如下面的反例所示:

#!/usr/bin/php
#A
<?php


#B
echo "Hello PHP\n";

第一行(shebang 行)被解释器特别忽略。PHP 标记之前的注释行回显到标准输出,因为它不在 PHP 标记中。打开 PHP 标记后的注释被解释为 PHP 代码,但是它被忽略,因为它是一个注释。

修订版本的输出为

#A
Hello PHP

除了个人偏好之外,是否有任何理由使用//而不是 # 作为评论?

我认为这只是个人偏好。//#之间没有区别。我个人使用 #进行一行注释,//进行代码注释,/** */进行块注释。

<?php
# This is a one-line comment
echo 'This is a test';


// echo 'This is yet another test'; // commenting code


/**
* This is a block comment
* with multi-lines
*/
echo 'One final test';
?>

如果您在您的团队/项目中建立了一些规则集... ... 这两种类型的注释可以用来概述注释代码的用途。

例如,我喜欢使用 #来静音/禁用配置设置、子函数,以及通常一段有用或重要的代码,但目前只是禁用。

没有正式的 PSR。

但是,在所有 PSR 示例代码中,它们使用 //作为内联注释。

有一个 PSR-2的扩展提案,旨在使其标准化,但它不是正式的: https://github.com/php-fig-rectified/fig-rectified-standards/blob/master/PSR-2-R-coding-style-guide-additions.md#commenting-code

//在 PHP 文化中更常用,但是也可以使用 #。我个人喜欢它,因为它更短,节省了字节。这是个人品味和偏见,没有正确的答案,直到,当然,它成为一个标准,这是我们应该尽可能遵循的东西。

是的,但是存在跨平台的差异。

我一直在用 # 在 PHP 中进行注释,但是我注意到了采用上的不同。

在 Windows 键盘上,# 键很容易使用。 在 Mac 键盘上 # key 大多不存在。

所以对于 mac 用户来说,[ Alt ] + [3]或[ something ] + [3]比//更难输入,所以//已经成为一种跨平台的方式来显示带注释的代码。

这是我的观察。

来自 https://php.net/manual/en/migration53.deprecated.php

“ PHP 5.3.x 中不推荐的特性... . INI 文件中不推荐以 # 开头的注释。”

就是这样。在默认情况下,“ #”似乎仍然是一个注释选项,因为它没有被弃用。我打算使用它来区分嵌套的 if/else 语句的各个层,并标记它们的结束括号,或者像其他人在相关文章中建议的那样,使用它来区分代码注释和注释掉的代码。(注意: 链接在4/23/19时是有效的/正常工作的,虽然谁知道当你阅读这篇文章时它是否还在工作。)

除了个人偏好外,是否有任何理由使用 而不是 # 征求意见?

我来这里是为了寻找答案,很高兴知道有 没有的代码差异。

然而,在偏好方面,人们可能会认为您更喜欢“ shell-> perl-> php”注释一致性而不是“ c-> php”方式。

因为我确实把 php 作为一个穷人的 webby perl,所以我使用了 # 。.然后我看到了别人的代码,就直接找到了 SO。;)

问题: 除了个人偏好之外,是否有任何理由使用//而不是 # 作为评论?

一个2021年的答案,这当然不是我们在这个帖子中看到的唯一答案:

如果使用 VisualStudio 代码并使用区域阻塞代码,则必须使用 #而不是 //来定义区域。对于这个问题,不,即使对于这个用例: 如果要注释一个区域,您也可以使用 #///** */,您使用的技术是个人偏好。

VSCode 中的块定义示例:

#region this is a major block
/** DocBlock */
function one() {}
/** DocBlock */
function two() {
#region nested region based on indentation
// comments and code in here
# another nested region based on indentation
// foo
#endregion
#endregion
}
#endregion

关于内圈的折叠:

#region this is a major block
/** DocBlock */
function one() {}
/** DocBlock */
function two() {
>  #region nested region based on indentation
}
#endregion

关于外圈的折叠:

> #region this is a major block

我列举了下面这些具体的用法,你可能很想尝试一下,但是这些都不起作用。事实上,这正是禁用 # 区域块的方法:

// #region
// #endregion
/** #region */
/** #endregion */

至于在 VSCode 中注释一个区域:

/** You can now collapse this block
#region Test1
// foo
#endregion
// everything through to here is collapsed
*/


// #region Test1
// folding is disabled here
// #endregion


# #region Test1
// this also disables the fold
# #endregion

所有这些都说明,“ 除了个人偏好之外,是否有任何理由使用//而不是 # 作为评论?”我同意这个帖子中的评论,也同意在 另一条线中的评论: //更为常见,这通常是在 #上使用这种评论风格的一个很好的理由。

最后要注意的是,要小心基于缩进的嵌套,因为代码格式化可能会删除手动缩进,从而破坏基于注释的嵌套块方案。我已经用 #//(顺便说一句,//也嵌套在缩进上)测试了这个。同样,在 OP 问题的上下文中,没有理由在当前 VSCode 的上下文中使用 // over #进行嵌套缩进,因为两者的工作原理完全相同。但是,这是在 //上使用 #的用例。

Ref -不需要扩展,在1.62.3中已验证。请参阅关于缩进的说明。