常數
變數所儲存的值能夠被改變,所以稱為為變數
相對於變數的常數,則是負責儲存恆常不變的值,因此稱作「常數」
常數通常是用來將一個固定的值連結到一個有意義的名稱
而在程式碼中就可以用有意義的名稱來存取相對應的值,增加程式碼可讀性
常數的值只能是「純量值(scalar types)」,也就是以下這4種型態
- 字串
- 數字
- 浮點數
- 布林值
物件是無法當做常數的數值的
(物件之後會在談到... 要死 要寫得好多)
定義常數的PHP語法如下
//定義常數
define("常數名稱",常數值); //PHP原本就支援
const 常數名稱 = 常數值; //PHP 5.3之後才支援
//定義常數陣列
define("常數名稱",['值1','值2','值3']); //PHP7才開始支援
const 常數名稱 = ['值1','值2','值3']; //PHP 5.6之後才支援
常數命名規則
常數命名的規則基本上與變數命名一樣,也有區分大小寫,但前方不需要「$」
常數開頭必須為
- 英文字母(A-Z & a-z)
- 底線(_)
後面可以接長度不限的英文字母、數字或是底線
慣例上,常數的命名上習慣使用全大寫英文,前面再加上底線
因為這麼做能在程式碼中更清楚的分辨「常數」與「變數」,增加程式碼的可讀性
//定義常數PI(π)
define("PI",3.1415926); //或是使用_PI
//變數$r代表半徑
$r = 3;
//計算圓面積,可以清楚看出PI是常數,$r是變數
$circle_area = $r*$r*PI;
常數作用範圍
常數不受變數作用範圍的約束,包括函數內,任何地方都可以直接存取常數
常數使用時需注意的幾個地方
在上面介紹的語法有分成defined()
和const
這兩種語法來定義常數
這兩種語法不一樣的地方是,不能在函數、迴圈或是if
等控制流程中使用const
定義常數
<?php
function preRun(){
define("PI",3.1415926);//函數內不能使用const
}
function circleArea(){
$circle_area = 3*3*PI;
echo $circle_area;
}
preRun();
circleArea();
//這樣會輸出28.2743334
?>
<?php
function preRun(){
const PI = 3.1415926;
}
function circleArea(){
$circle_area = 3*3*PI;
echo $circle_area;
}
preRun();
circleArea();
//這樣會輸出錯誤 Parse error: syntax error, unexpected 'const' (T_CONST)
//因為const不能再function內做使用
?>
再來要注意的地方是,常數定義只能定義一次,而且定義了就不能改
<?php
const _APPLE = "apple";
const _APPLE = "iphone";
?>
像是這樣將一個函數定義了2次,會輸出提醒,告知你_APPLE
這個常數已經被定義了
Notice: Constant _APPLE already defined
而且常數定義時就必須要給定值,不能分開,像是以下這個例子也會出現錯誤
<?php
const _APPLE;
_APPLE = "apple";
?>
常數的常用函數
使用get_defined_constants()
可以取得目前已經定義的全部常數陣列
使用defined()
函數可以判斷一個常數是某已經被定義
<?php
if(defined("PI")){
echo "yes";
}
else{
echo "no";
}
//最後會輸出no,因為在這邊沒有定義過PI這個常數
?>
魔術常數
在PHP中有許多系統預設的常數供工程師來使用,稱之為魔術常數,魔術常數前後都是以兩個底線包圍
這邊只介紹幾個比較特殊的魔術函數,會隨情況不同而產生不同的值
如果有興趣的話可以看看全部的魔術常數
名稱 | 描述 |
---|---|
__LINE__ | 回傳目前在檔案中的行數 |
__FILE__ | 回傳目前檔案的完整檔案路徑 |
__DIR__ | 回傳目前檔案所在的目錄完整路徑(PHP 5.3.0加入) |
__FUNCTION__ | 回傳目前所在的函式名稱(PHP 4.3.0加入) |
__CLASS__ | 回傳目前的類別名稱(PHP 4.3.0加入) |
__METHOD__ | 回傳類別的成員函式名稱(PHP 5.0.0加入) |
__NAMESPACE__ | 回傳目前的命名空間名稱(PHP 5.3.0加入) |
以下範例檔案test.php
,已經超出目前所講解的範圍,大略看過即可
<?php
namespace NamespaceName;
class ClassName {
function MethodName() {
echo __LINE__; // 6
echo __FILE__; // C:\appserv\www\test.php
echo __DIR__; // C:\appserv\www\
echo __FUNCTION__; // MethodName
echo __CLASS__; // NamespaceName\ClassName
echo __METHOD__; // NamespaceName\ClassName::MethodName
echo __NAMESPACE__; // NamespaceName
}
}
$obj = new ClassName;
$obj->MethodName();
?>