2022年7月14日

寫給 PHP 新手的物件導向教學(五):const

上一回《寫給 PHP 新手的物件導向教學(四):this,self 與 static》

前面幾回介紹了類別成員與函式的可見度,也介紹了 static,這一回會介紹類別常數 const

常數 Constant

首先先介紹一下,什麼是 constconstconstant 的縮寫,也就是常數

常數一但被定義,它的內容在程式執行期間,就不能再被動態的修改了。也就是說,常數的內容,在程式撰寫的當下,就決定好了。

$name = 'Tom'; $name = 'Tommy'; // 一般的變數可以隨時修改內容,但常數不行。

那通常在什麼情況下會用到常數?

  • 在社會、自然中,眾所皆知,不太可能會改變的數值。例如:圓周率 3.141592 、營業稅費率 0.2 等等。
  • 商業邏輯上的魔術數字、或常用的名稱:優惠時段開始時間 23:00:00、平台組織名稱 超好買購物平台 等等。
  • 系統的環境變數:資料庫的主機名稱 127.0.0.1、時區設定 GMT+8 等等。

一些不會變、或是不會經常變動的資料,就可以視為一種常數。 也可以另一個角度來看,當開發者不希望某些值被改變時,也可以把它們定義為常數。

類別常數

在類別中我們可以透過 PHP 保留字 const 來定義類別常數。

下面的例子是,我們想要知道一個人是否過胖,於是我們撰寫了一小段程式來進行判斷。

根據不科學的研究,當 BMI > 30 時,代表過胖了。

於是我們使用 const 在類別中定義一個常數 TOO_FAT_BMI,並給予其值 30

class BmiChecker { public const TOO_FAT_BMI = 30; public function isTooFat($bmi) { return $bmi > self::TOO_FAT_BMI; } }

實際使用:

$bmiChecker = new BMIChecker(); var_dump($bmiChecker->isTooFat(35)); // bool(true) var_dump($bmiChecker->isTooFat(25)); // bool(false)

範例中,我們有定義一個函式 isTooFat,專門用來判斷,在類別中呼叫類別常數跟 staic 很像,都是用 self 來呼叫。 而它的行為也確實跟 static 很像,在所有同類別的物件中,看到的常數都是一樣的。 因此就結果來看,最大的差別就是 const 不能修改,但 static 可以。

我們再來看另一個跟 static 很像的用法,我們一樣可以在類別的讀取類別常數。

// 你的 BMI 已經大於 30 了,建議您該多動動身體! echo "你的 BMI 已經大於 " . BMIChecker::TOO_FAT_BMI . " 了,建議您該多動動身體!"; echo "BMI的正常標準是低於 " . $bmiChecker::TOO_FAT_BMI;

static 一樣,都是使用 Scope Resolution Operator :: 來讀取類別常數。

但有一個跟 static 很不一樣的重點要留意,就是常數變數的名稱,開頭不需要也不能有 $ 字號。

類別常數命名慣例

對於常數,在 PHP 中的慣例是 UPPER CASE,也就是使用全大寫,並使用底線區來區隔單字。

例如:SPECIAL_DATEDATABASE_HOSTNAMETHIS_IS_A_LONG_EXAMPLE 等等

小結

本回快速地帶過了類別常數的概念。常數在開發上是一個很實用的想法,如果應用妥善,可以增加程式的可維護性及可讀性。

重點回顧:

  1. conststatic 的運作方式很像。就結果來看,最大的差別就是 const 不能修改,但 static 可以。
  2. 在類別內可以透過 self 來取用類別常數,在類別外則可以使用 Scope Resolution Operator ::
  3. 類別常數名稱不能使用 $ 開頭。
  4. 任何不會變,或是你希望它不要變的東西,可以考慮定義成為常數。

目錄:寫給 PHP 新手的物件導向教學