常數

變數所儲存的值能夠被改變,所以稱為為變數
相對於變數的常數,則是負責儲存恆常不變的值,因此稱作「常數」

常數通常是用來將一個固定的值連結到一個有意義的名稱
而在程式碼中就可以用有意義的名稱來存取相對應的值,增加程式碼可讀性

常數的值只能是「純量值(scalar types)」,也就是以下這4種型態

  1. 字串
  2. 數字
  3. 浮點數
  4. 布林值

物件是無法當做常數的數值的
(物件之後會在談到... 要死 要寫得好多)

定義常數的PHP語法如下

//定義常數
define("常數名稱",常數值); //PHP原本就支援
const 常數名稱 = 常數值; //PHP 5.3之後才支援

//定義常數陣列
define("常數名稱",['值1','值2','值3']); //PHP7才開始支援
const 常數名稱 = ['值1','值2','值3']; //PHP 5.6之後才支援

常數命名規則

常數命名的規則基本上與變數命名一樣,也有區分大小寫,但前方不需要「$」

常數開頭必須為

  1. 英文字母(A-Z & a-z)
  2. 底線(_)

後面可以接長度不限的英文字母、數字或是底線

慣例上,常數的命名上習慣使用全大寫英文,前面再加上底線
因為這麼做能在程式碼中更清楚的分辨「常數」與「變數」,增加程式碼的可讀性

//定義常數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();
?>

results matching ""

    No results matching ""