上一回《寫給 PHP 新手的物件導向教學(四):this,self 與 static》。
前面幾回介紹了類別成員與函式的可見度,也介紹了 static
,這一回會介紹類別常數 const
。
常數 Constant
首先先介紹一下,什麼是 const
,const
是 constant
的縮寫,也就是常數。
常數一但被定義,它的內容在程式執行期間,就不能再被動態的修改了。也就是說,常數的內容,在程式撰寫的當下,就決定好了。
$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_DATE
、DATABASE_HOSTNAME
、THIS_IS_A_LONG_EXAMPLE
等等
小結
本回快速地帶過了類別常數的概念。常數在開發上是一個很實用的想法,如果應用妥善,可以增加程式的可維護性及可讀性。
重點回顧:
const
跟static
的運作方式很像。就結果來看,最大的差別就是const
不能修改,但static
可以。- 在類別內可以透過
self
來取用類別常數,在類別外則可以使用 Scope Resolution Operator::
。 - 類別常數名稱不能使用
$
開頭。 - 任何不會變,或是你希望它不要變的東西,可以考慮定義成為常數。