iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 3
2
Modern Web

成為 Modern PHPer系列 第 3

Day 03:PSR-12 概述

  • 分享至 

  • xImage
  •  

世界是混沌的,直到有了 PSR-0;
世界是混亂的,直到有了 PSR-1;
世界是戰亂的,直到有了 PSR-2;

前言

PSR,全名 PHP Standards Recommendations,是一個由非官方委員會 PHP-FIG 所提出的一系列標準。

PSR 包括但不限於 Coding Style,通常來說會建議在一定程度的基礎上去遵守這些標準。

PSR 比較知名的應該是

  • PSR-1:基礎 Coding Style 規範
  • PSR-2(已廢棄):Coding Style 指南
  • PSR-3:Logger 介面
  • PSR-4:Autoloader 標準
  • PSR-7:HTTP 訊息介面

為了因應 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

extendsinterface 的位置

class A extends B implements C
{
}

extendsimplements 會放在同一行

class A extends B implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
}

如果 implement 的 interface 很多,可以將每一個 interface 各寫一行

traits 的使用

class A
{
    use B;
    use C;
}

如果在同一個 class 中用到多個 traits,需要每行一個 traits,不可寫在同一行。

括號的位置

  • class 的括號
class A
{
}
  • method 的括號
public function methodOne()
{
}

public function methodTwo(
    $arg1,
    $arg2,
    $arg3
) {
}
  • method 的 return type
public function methodOne(): void
{
}

public function methodTwo(
    $arg1,
    $arg2,
    $arg3
): void {
}
  • abstractfinal 在可見度之前;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 的縮進如上所示
  • 如果 case 沒有 break;,要加上 // no break 的 comment

後記

本篇文章中,我僅挑出幾個比較容易忽略的。

基本上 PSR-12 與 PSR-2 是相當類似(換行、空格的邏輯),如果已經習慣於 PSR-2 時應該不太會有門檻。


上一篇
Day 02:內置伺服器
下一篇
Day 04:trait 的使用
系列文
成為 Modern PHPer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
alansyue
iT邦新手 5 級 ‧ 2020-01-30 15:58:10

關鍵字小寫中的 flase 應該是 false 唷~

我要留言

立即登入留言