Coding Gun

การประกาศค่าคงที่(Constant)ใน PHP

ค่าคงที่จะแตกต่างจากตัวแปรตรงที่เมื่อประกาศแล้วจะไม่สามารถเปลี่ยนแปลงค่าได้ เราจะใช้ค่าคงที่เมื่อเราอ้างอิงถึงค่าที่ไม่มีการเปลี่ยนแปลง เช่น ID ของ Master data ใน database เช่น Order status แทนที่เราจะใส่ใน Code เป็น 1,2,3 เราจะประกาศ constant ขึ้นมาเป็น ORDERED, PAID, COMPLETED แทน Code จะเปลี่ยนจาก

เรานิยมใช้ Constant เป็นตัวพิมพิ์ใหญ่เพื่อให้ง่ายต่อการอ่าน

1
2
3
if($orderStatus == 1){
    // do something
}

ไปเป็น

1
2
3
4
define("ORDERED", 1);
if($orderStatus == ORDERED){
    // do something
}

การประกาศ constant ใน PHP จะมีข้อกำหนดดังนี้่

การกำหนดค่า Constant

การกำหนดค่า Constant จะมีอยู่ 2 วิธีคือ

  1. Function define()
  2. const keyword

การใช้ function define()

define() จะมี parameters อยู่ 3 ตัวด้วยกันคือ

  1. ชื่อ Constant
  2. ค่าของ Constant
  3. ต้องการให้ชื่อเป็น Case-insensitive (ตัวอักษรตัวใหญ่หรือตัวเล็กไม่ต่างกัน) โดย default จะเป็น FALSE
define("PI", 3.14159);
echo PI;

ถ้าต้องการให้เรียกใช้ค่าคงที่(Constant) แบบ Case-insensitive ด้วยการกำหนด Parameter ตัวที่ 3 เป็น TRUE

define("PI", 3.14159, true);
echo pi; // เราสามารถใช้ pi หรือ PI ก็ได้

Const Keyword

เราอาจเลือกใช้ const แทน define() ได้ ซึ่งความแตกต่างของ define() และ const คือ define จะเรียกใช้งานในรูปแบบของ function เหมือนในตัวอย่างก่อนหน้า แต่ const จะเป็น keyword ที่นำไปวางหน้าตัวแปรแบบนี้

const PI = 3.14159;
echo PI;

นอกจากการเขียนที่ไม่เหมือนกันแล้ว const เป็นค่าคงที่ ที่อยู่ใน local scope ส่วน define เป็นการประกาศค่าคงที่ใน global scope ซึ่งจะทำให้ const ถูกนำไปใช้ใน class ได้ แต่ define จะไปวางไว้ใน class ไม่ได้

1
2
3
4
5
6
7
8
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

ใน class เราจะประกาศตัวแปร CONSTANT ขึ้นมาในบรรทัดที่ 3 และนำไปใช้ใน function showConstant(บรรทัดที่ 6) จุดสังเกตคือเราต้องนำหน้าด้วย keyword self:: เพราะเมื่อประกาศค่าคงที่จะเป็นตัวแปรในระดับของ class(ทุกๆ object ที่สร้างจาก class นี้จะอ้างถึงตัวแปรเดียวกัน)

ถ้าเรียกใช้งานจาก class อื่นๆให้ใช้ชื่อ class นำหน้าแบบนี้

class Account{
  const VAT = 0.07;
}

$price = 1200;
echo $price + ($price * Account::VAT). "<br/>";

ถ้ามี namespace เราต้องแน่ใจว่า คำสั่งที่เราเรียกใช้งานนั้นอยู่ใน namespace เดียวกันแบบนี้

1
2
3
4
5
6
namespace foo {
    class bar {
    }

    echo bar::class;
}

ถ้าเรียกใช้นอก namespace นี้จะต้องใช้ foo\bar แทน

Constant อาจไม่สามารถเปลี่ยนแปลงค่าหลังจากประกาศไปแล้ว แต่สามารถที่จะใส่ expression เข้าไปได้ หมายความว่าค่าคงที่อาจมาจากการคำนวนได้ เช่น

1
2
3
4
5
6
const ONE = 1;
class foo {
    const TWO = ONE * 2; // TWO = 1 * 2
    const THREE = ONE + self::TWO; // THREE = 1 + 2
    const SENTENCE = 'The value of THREE is '.self::THREE;
}

นอกจากนี้แล้ว constant ยังสามารถใส่ access modifier(public หรือ private) เข้าไปได้ด้วย เช่น

1
2
3
4
5
class Customer {
    private const name = 'Phanupong';
}
echo "My name is ${name}";
?>

อ่านบทความอื่นๆต่อได้ที่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security