介紹PHP中常術的用法,包含語法、命名規則和魔術常數 (Magic constant)。

語法

變數的值會改變而稱為變數,那相對於變數的常數,則是恆常不變的值而稱作常數 (Constant)。常數在宣告之後,就無法再改變它的值,除了魔術常數 (magic constant) 有可能會改變,因為他並非是真正的常數。常數是有大小寫之分,而常數的命名規則和變數一樣,以正規表示法表示如下:

1
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

常數的使用和特性如下:

  • 使用 define() 函式或 const 關鍵字宣告常數 (PHP 5.3.0 之後),但 const 關鍵字無法用在函式中,且和 static 類似,必須直接指定值,不可運算。
  • 常數只能是數值的值,包括布林、整數、浮點數和字串,雖然也可以設為資源,但有可能會出現問題。
  • 使用常數未定義時,會視為字串使用。可以使用 defined() 函式來判斷是否已定義。
  • 和變數不一樣,常數不需要使用錢號 ($) 做開頭。除直接使用外,也可以用 constant() 函式取得常數值。
  • 常數沒有範圍 (或當作是全域),任何地方宣告使用常數都為同一份。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
var_dump(FOOL);                   // string(4) "FOOL", 自動當作字串

define("FOOL", "Lala");
const Fool = "Dindin";
var_dump(FOOL); // string(4) "Lala"
var_dump(Fool); // string(6) "Dindin"

function func() {
var_dump(defined("FOOL")); // bool(true)
//const BRA = "F"; // parse error, 不可在函式中使用
define("BRA", "F");
}
func();

var_dump(constant("BRA")); // string(1) "F"

$num = 178;
define("_BOOL", true);
define("_INT", $num);
// const _FLOAT = 169 + 0.99; // parse error, 必須直接指定值
define("_FLOAT", 169 + 0.99);
define("_ARRAY", array(55, 66)); // 失敗, 但不會出錯
define("_OBJECT", new stdClass); // 失敗, 但不會出錯
$fp = fopen("res.txt", "rw+");
define("_RESOURCE", $fp);
define("_NULL", NULL);

var_dump(_BOOL); // bool(true)
var_dump(_INT); // int(178)
var_dump(_FLOAT); // float(169.99)
var_dump(_ARRAY); // string(6) "_ARRAY"
var_dump(_OBJECT); // string(7) "_OBJECT"
var_dump(_RESOURCE); // resource(3) of type (stream)
var_dump(_NULL); // NULL
fclose($fp);

根據官方文件記載,命名規則應該與變數命名相同,但實際上使用 define() 函式卻可以使用不合法的命名,但使用時必須透過 constant() 函式取值。

1
2
3
4
5
define("3M", "300cm");
//const 7-11 = "Always open"; // parse error

var_dump(constant("3M")); // string(5) "300cm"
//var_dump(3M); // parse error

另外可以利用 get_defined_constants() 函式取得目前所有的常數。除此之外,類別的常數成員用法與此不同,之後再做討論。

魔術常數

PHP 中有很多預定義常數,其中許多部分是來自不同的 Extension,除此之外,PHP 有另外七種魔術常數 (Magic constant),可以取得特別的資訊。雖然他們叫作常數,不過事實上會在不同的地方而有不同的值。

名稱描述
__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 加入)

一些使用範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();

延伸閱讀

上一篇 PHP 教學 - 變數 (Variables)
下一篇 PHP 教學 - 運算子 (Operators) - 上