世界是混沌的,直到有了 PSR-0;
世界是混亂的,直到有了 PSR-1;
世界是戰亂的,直到有了 PSR-2;
PSR,全名 PHP Standards Recommendations,是一個由非官方委員會 PHP-FIG 所提出的一系列標準。
PSR 包括但不限於 Coding Style,通常來說會建議在一定程度的基礎上去遵守這些標準。
PSR 比較知名的應該是
為了因應 PHP 7.3 的某些新 Features,所以將 PSR-2 廢棄後提出了 「PSR-12:擴展的 Coding Style 指南」
因為整篇 PSR 非常的複雜(囉嗦),所以我這邊僅提出幾個我認為重要的概念。
?>
當文件中不存在 PHP 以外的程式時,可省略 ?>
。
<?php
echo 'Hello World';
當文件中僅存在 PHP 程式碼時,不需要 ?>
<html>
<head>
</head>
<body>
<?php echo 'Hello World'; ?>
</body>
</html>
當文件為 HTML 與 PHP 混合時,需要 ?>
關於這項規則的來由,可以參考這篇 Stack Overflow:Why would one omit the close tag?
PHP 的保留關鍵字都必須是小寫。
會使用 true
而非 TRUE
;會使用 false
而非 FALSE
。
關於這項規則,可能是來自於避免與常數混淆。
以下範例來自於 PSR-12 的範例結構
<?php
/**
* 這裡是文件級的 Document
*/
declare(strict_type=1); // 一個或多個聲明(declare)
namespace Vendor\Package; // 聲明 namespace
// 基於「類別」的 use
use Vendor\Package\{ClassA as A, Class B, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;
use Vendor\Package\AnotherNamespace\ClassE as E;
// 基於「函式」的 use
use function Vendor\Package\{functionA, functionB, functionC};
use function Another\Vendor\functionD;
// 基於「常數」的 use
use const Vendor\Package\{CONSTANT_A, CONSTANT_B, CONSTANT_C};
use const Another\Vendor\CONSTANT_D;
// 以下為剩餘的 PHP 程式碼
class FooBar
{
// ... additional PHP code ...
}
new
時始終存在 ()
class A
{
}
new A; // 錯誤的
new A(); // 正確的
無論 class A
是否存在 constructor,都應該使用 new A()
去建立 class A
extends
與 interface
的位置class A extends B implements C
{
}
extends
及 implements
會放在同一行
class A extends B implements
\ArrayAccess,
\Countable,
\Serializable
{
}
如果 implement
的 interface 很多,可以將每一個 interface 各寫一行
traits
的使用class A
{
use B;
use C;
}
如果在同一個 class 中用到多個 traits,需要每行一個 traits,不可寫在同一行。
class A
{
}
public function methodOne()
{
}
public function methodTwo(
$arg1,
$arg2,
$arg3
) {
}
public function methodOne(): void
{
}
public function methodTwo(
$arg1,
$arg2,
$arg3
): void {
}
abstract
及 final
在可見度之前;static
在可見度之後abstract protected function abstractFunction();
final public function finalFunction()
{
}
protected static $staticVar;
if
, else
, elseif
if ($expr1) {
// if
} elseif ($expr2) {
// else if
} else {
// else
}
如果 $expr
具有多行,每行一個
if (
$expr1
&& $expr2
) {
}
switch
switch($expr) {
case 0:
echo '0';
break;
case 1:
echo '1';
// no break
case 2:
case 3:
case 4:
echo '2, 3 or 4';
break;
default:
echo 'default';
break;
}
switch
的縮進如上所示break;
,要加上 // no break
的 comment本篇文章中,我僅挑出幾個比較容易忽略的。
基本上 PSR-12 與 PSR-2 是相當類似(換行、空格的邏輯),如果已經習慣於 PSR-2 時應該不太會有門檻。