(PHP 5 >= 5.3.0, PHP 7)
รายการคำถามนี้แบ่งออกเป็นสองส่วน: คำถามทั่วไปและข้อมูลเฉพาะด้านการใช้งานบางอย่างที่เป็นประโยชน์สำหรับความเข้าใจที่สมบูรณ์ยิ่งขึ้น
ขั้นแรกคำถามทั่วไป
- หากฉันไม่ใช้เนมสเปซ สิ่งเหล่านี้ควรถือว่าสำคัญหรือไม่
- ฉันจะใช้คลาสภายในหรือระดับโลกในเนมสเปซได้อย่างไร
- ฉันจะใช้ฟังก์ชันคลาสในเนมสเปซหรือค่าคงที่ในเนมสเปซของตัวเองได้อย่างไร
- ชื่อแบบนั้นเป็นยังไงบ้าง. \ของฉัน\ชื่อหรือ \ชื่อเปลี่ยนใจเลื่อมใส?
- เหมือนชื่อเหมือน \ชื่อของฉันเปลี่ยนใจเลื่อมใส?
- เหมือนชื่อคลาสที่ไม่เข้าเงื่อนไขเช่น ชื่อเปลี่ยนใจเลื่อมใส?
- เช่นเดียวกับชื่อฟังก์ชันที่ไม่มีเงื่อนไขหรือชื่อคงที่ที่ไม่มีเงื่อนไขเช่น ชื่อเปลี่ยนใจเลื่อมใส?
รายละเอียดการใช้งานเนมสเปซบางส่วนที่เป็นประโยชน์ในการทำความเข้าใจ
- ชื่อที่นำเข้าต้องไม่ขัดแย้งกับคลาสที่กำหนดไว้ในไฟล์เดียวกัน
- ไม่สามารถนำเข้าฟังก์ชันหรือค่าคงที่โดยใช้ตัวดำเนินการ ใช้.
- ชื่อเนมสเปซแบบไดนามิก (ตัวระบุที่อยู่ในเครื่องหมายคำพูด) จะต้องหลีกอักขระแบ็กสแลช
- คุณไม่สามารถอ้างถึงค่าคงที่ที่ไม่ได้กำหนดโดยใช้แบ็กสแลช มีข้อผิดพลาดร้ายแรงปรากฏขึ้น
- ไม่สามารถแทนที่ค่าคงที่พิเศษ เช่น NULL, TRUE, FALSE, ZEND_THREAD_SAFE หรือ ZEND_DEBUG_BUILD
หากฉันไม่ใช้เนมสเปซ สิ่งเหล่านี้ควรถือว่าสำคัญหรือไม่
เลขที่ เนมสเปซไม่มีผลกระทบต่อโค้ดที่มีอยู่ในรูปแบบใดๆ หรือโค้ดใดๆ ที่เขียนโดยไม่มีเนมสเปซ คุณสามารถเขียนโค้ดเช่นนี้ได้หากต้องการ:
ตัวอย่างที่ 1 การเข้าถึงคลาสระดับโลกภายนอกเนมสเปซ
$a = ใหม่ \ stdClass ;
?>
นี่คือฟังก์ชันการทำงานที่เทียบเท่ากับสิ่งต่อไปนี้:
ตัวอย่างที่ 2 การเข้าถึงคลาสระดับโลกภายนอกเนมสเปซ
$a = stdClass ใหม่ ;
?>
ฉันจะใช้คลาสภายในหรือระดับโลกในเนมสเปซได้อย่างไร
ตัวอย่าง #3 การเข้าถึงคลาสภายในในเนมสเปซ
เนมสเปซ foo ;
$a = ใหม่ \ stdClass ;
การทดสอบฟังก์ชัน (\ArrayObject $type Hintexample = null ) ()
$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;
// ส่วนขยายของคลาสภายในหรือระดับโลก
คลาส MyException ขยาย\ข้อยกเว้น()
?>
ฉันจะใช้ฟังก์ชันคลาสในเนมสเปซหรือค่าคงที่ในเนมสเปซของตัวเองได้อย่างไร
ตัวอย่างที่ 4 การเข้าถึงคลาสภายใน ฟังก์ชัน หรือค่าคงที่ในเนมสเปซ
เนมสเปซ foo ;
คลาส MyClass()
// ใช้คลาสจากเนมสเปซปัจจุบัน
การทดสอบฟังก์ชัน (MyClass $type Hintexample = null ) ()
// อีกวิธีหนึ่งในการใช้คลาสจากเนมสเปซปัจจุบัน
การทดสอบฟังก์ชัน(\foo\MyClass $typehintexample = null)()
// ขยายคลาสจากเนมสเปซปัจจุบัน
คลาสขยายขยาย MyClass()
// เข้าถึงฟังก์ชันโกลบอล
$a = \globalfunc();
// เข้าถึงค่าคงที่ทั่วโลก
$ข = \INI_ALL ;
?>
ชื่อแบบนั้นเป็นยังไงบ้าง. \ของฉัน\ชื่อหรือ \ชื่อเปลี่ยนใจเลื่อมใส?
ชื่อที่ขึ้นต้นด้วย \ จะถูกแปลงเป็นสิ่งที่พวกเขาดูเหมือนเสมอเช่น \ของฉัน\ชื่อ- นี่คืออันที่จริง \ชื่อของฉัน, และ \ข้อยกเว้น- นี้ ข้อยกเว้น.
ตัวอย่างที่ 5 ชื่อสัมบูรณ์
เนมสเปซ foo ;
$a = ใหม่ \ ฉัน \ ชื่อ (); // สร้างอินสแตนซ์ของคลาส "my\name"
echo\strlen("สวัสดี"); // เรียกใช้ฟังก์ชัน "strlen"
$a = \INI_ALL ; // ตัวแปร $a ถูกกำหนดให้เป็นค่าคงที่ "INI_ALL"
?>
เหมือนชื่อเหมือน \ชื่อของฉันเปลี่ยนใจเลื่อมใส?
ชื่อที่มีแบ็กสแลชแต่ไม่ได้ขึ้นต้นด้วย เช่น \ชื่อของฉัน
ของฉันชื่ออื่น ดังนั้นคำพ้องความหมายนี้จึงมีผลกับ ของฉันวี \ชื่อของฉัน.
\ชื่อของฉัน.
ตัวอย่างที่ 6 ชื่อเต็ม
เนมสเปซ foo ;
ใช้ blah \ blah เป็น foo ;
$a = ใหม่ ฉัน\ชื่อ(); // สร้างอินสแตนซ์ของคลาส "foo\my\name"
foo\bar::name(); // เรียกเมธอดสแตติก "ชื่อ" ในคลาส "blah\blah\bar"
ของฉัน\บาร์(); // เรียกใช้ฟังก์ชัน "foo\my\bar"
$a = ของฉัน\BAR; // กำหนดตัวแปร $a เป็นค่าคงที่ "foo\my\BAR"
?>
เหมือนชื่อชั้นที่ไม่เข้าเงื่อนไขเช่น ชื่อเปลี่ยนใจเลื่อมใส?
ชื่อคลาสที่ไม่มีแบ็กสแลช เช่น ชื่อสามารถแปลงได้สองวิธี
หากมีการนำเข้านิพจน์ที่สร้างคำพ้องความหมาย ชื่อชื่ออื่นจึงใช้คำพ้องความหมายนี้
มิฉะนั้น ชื่อเนมสเปซปัจจุบันจะกลายเป็นคำนำหน้า \ชื่อของฉัน.
ตัวอย่างที่ 7 ชื่อชั้นเรียนที่ไม่มีเงื่อนไข
เนมสเปซ foo ;
ใช้ blah \ blah เป็น foo ;
$a = ชื่อใหม่(); // สร้างอินสแตนซ์ของคลาส "foo\name"
ฟู::ชื่อ(); // เรียกเมธอดสแตติก "name" ในคลาส "blah\blah"
?>
เช่นเดียวกับชื่อฟังก์ชันที่ไม่มีเงื่อนไขหรือชื่อคงที่ที่ไม่มีเงื่อนไขเช่น ชื่อเปลี่ยนใจเลื่อมใส?
ชื่อของฟังก์ชันหรือค่าคงที่ที่ไม่มีเครื่องหมายแบ็กสแลช เช่น ชื่อสามารถแปลงได้สองวิธี
ขั้นแรก ชื่อเนมสเปซปัจจุบันจะขึ้นต้นด้วย ชื่อ.
แล้วถ้าค่าคงที่หรือฟังก์ชัน ชื่อไม่มีอยู่ในเนมสเปซปัจจุบัน โดยใช้ค่าคงที่หรือฟังก์ชันโกลบอล ชื่อถ้ามันมีอยู่จริง
ตัวอย่างที่ 8 ฟังก์ชันที่ไม่สมบูรณ์หรือชื่อคงที่
เนมสเปซ foo ;
ใช้ blah \ blah เป็น foo ;
ค่า FOO = 1 ;
ฟังก์ชั่น my()()
ฟังก์ชั่นฟู()()
การเรียงลำดับฟังก์ชัน (& $a )
{
\sort($a); // เรียกฟังก์ชันโกลบอลว่า "sort"
$a = array_flip($a);
กลับ $a;
}
ของฉัน(); // เรียก "foo\my"
$a = strlen("สวัสดี"); // เรียกฟังก์ชันโกลบอล "strlen" เพราะไม่มี "foo\strlen"
$arr = อาร์เรย์(1, 3, 2);
$b = เรียงลำดับ($arr); // เรียกใช้ฟังก์ชัน "foo\sort"
$c = ฟู(); // เรียกใช้ฟังก์ชัน "foo\foo" - ไม่มีการนำเข้า
$a = FOO ; // กำหนดตัวแปร $a เป็นค่าคงที่ "foo\FOO" - ไม่มีการนำเข้า
$b = INI_ALL ; // กำหนดตัวแปร $b ให้มีค่าคงที่โกลบอล "INI_ALL"
?>
ชื่อที่นำเข้าต้องไม่ขัดแย้งกับคลาสที่กำหนดไว้ในไฟล์เดียวกัน
การรวมสคริปต์ต่อไปนี้ถูกต้อง:
เนมสเปซของฉัน\stuff;
คลาส MyClass()
?>
เนมสเปซอื่น ;
เรื่องของคลาส()
?>
เนมสเปซของฉัน\stuff;
รวม "file1.php" ;
รวม "another.php" ;
$a = MyClass ใหม่ ; // สร้างอินสแตนซ์ของคลาส "สิ่ง" จากเนมสเปซ "อีกอัน"
?>
ไม่มีความขัดแย้งเรื่องชื่อแม้ว่าชั้นเรียน มายคลาสมีอยู่ภายในเนมสเปซ สิ่งของของฉันเนื่องจากคำจำกัดความ MyClass อยู่ในไฟล์แยกต่างหาก อย่างไรก็ตาม ตัวอย่างต่อไปนี้ก่อให้เกิดข้อผิดพลาดข้อขัดแย้งของชื่อที่ร้ายแรง เนื่องจากคลาส MyClass ถูกกำหนดไว้ในไฟล์เดียวกับที่มีคำสั่ง use อยู่
เนมสเปซของฉัน\stuff;
ใช้ \ สิ่งอื่นเป็น MyClass ;
คลาส MyClass() // ข้อผิดพลาดร้ายแรง: MyClass ขัดแย้งกับนิพจน์การนำเข้า
$a = MyClass ใหม่ ;
?>
ไม่อนุญาตให้ใช้เนมสเปซที่ซ้อนกัน
PHP ไม่อนุญาตให้เนมสเปซซ้อนกัน
เนมสเปซของฉัน\สิ่งของ(
เนมสเปซซ้อนกัน (
คลาสฟู()
}
}
?>
อย่างไรก็ตาม หากต้องการจำลองเนมสเปซที่ซ้อนกันเช่นนี้:
เนมสเปซ my\stuff\nested (
คลาสฟู()
}
?>
ก่อน PHP 5.6 ไม่สามารถนำเข้าฟังก์ชันและค่าคงที่โดยใช้ตัวดำเนินการได้ ใช้.
ก่อน PHP 5.6 องค์ประกอบเดียวที่ได้รับผลกระทบจากตัวดำเนินการคือ ใช้คือเนมสเปซและชื่อคลาส หากต้องการย่อค่าคงที่หรือชื่อฟังก์ชันแบบยาว ให้นำเข้าเนื้อหาลงในเนมสเปซ
เหมืองเนมสเปซ ;
ใช้ชื่อพิเศษ \ ยาว \ ns \;
$a = ชื่อ \ คงที่ ;
ชื่อ\ฟังก์ชั่น();
?>
ตั้งแต่ PHP 5.6 เป็นต้นมา สามารถนำเข้าและสร้างนามแฝงสำหรับฟังก์ชันและชื่อคงที่ได้
ชื่อเนมสเปซแบบไดนามิก (ตัวระบุที่อยู่ในเครื่องหมายคำพูด) จะต้องหลีกอักขระแบ็กสแลช
สิ่งสำคัญคือต้องแสดงสิ่งนี้เนื่องจากแบ็กสแลชถูกใช้เป็นอักขระหลีกภายในสตริง ควรทำซ้ำเสมอเมื่อใช้ภายในสตริง มิฉะนั้นอาจมีความเสี่ยงต่อผลที่ตามมาโดยไม่ได้ตั้งใจ:
ตัวอย่าง #9 ข้อผิดพลาดเมื่อใช้ชื่อเนมสเปซภายในสตริงที่มีเครื่องหมายคำพูดคู่
$a = "อันตราย\ชื่อ" ; // \n เป็นการขึ้นบรรทัดใหม่ภายในสตริงที่มีเครื่องหมายคำพูดคู่!
$obj = ใหม่ $a ;
$a = "ไม่\at\all\dangerous" ; // ไม่มีปัญหาที่นี่
$obj = ใหม่ $a ;
?>
ภายในสตริงที่มีเครื่องหมายคำพูดเดี่ยว แบ็กสแลชเป็นตัวคั่นจะปลอดภัยกว่า แต่แนวทางปฏิบัติที่แนะนำในการหลีกแบ็กสแลชในสตริงทั้งหมดยังคงเป็นแนวปฏิบัติที่ดีที่สุด
คุณไม่สามารถอ้างถึงค่าคงที่ที่ไม่ได้กำหนดโดยใช้แบ็กสแลช มีข้อผิดพลาดร้ายแรงปรากฏขึ้น
ค่าคงที่ที่ไม่ได้กำหนดใดๆ ที่เป็นชื่อที่ไม่มีเงื่อนไข เช่น ฟูจะส่งผลให้มีข้อความระบุว่า PHP สันนิษฐานว่า ฟูคือค่าของค่าคงที่ ค่าคงที่ใดๆ ที่มีชื่อตามคุณสมบัติหรือชื่อสัมบูรณ์ที่มีอักขระแบ็กสแลชจะส่งผลให้เกิดข้อผิดพลาดร้ายแรงหากไม่พบ
ตัวอย่าง #10 ค่าคงที่ที่ไม่ได้กำหนด
แถบเนมสเปซ ;
$a = FOO ; // แสดงคำเตือน: ค่าคงที่ที่ไม่ได้กำหนด "FOO" ถือว่า "FOO";
$a = \FOO ; // ข้อผิดพลาดร้ายแรง: ค่าคงที่เนมสเปซที่ไม่ได้กำหนด FOO
$a = บาร์\FOO; // ข้อผิดพลาดร้ายแรง: ค่าคงที่เนมสเปซที่ไม่ได้กำหนด bar\Bar\FOO
$a = \บาร์ \FOO ; // ข้อผิดพลาดร้ายแรง: ค่าคงที่เนมสเปซที่ไม่ได้กำหนด Bar\FOO
?>
ไม่สามารถแทนที่ค่าคงที่พิเศษ เช่น NULL, TRUE, FALSE, ZEND_THREAD_SAFE หรือ ZEND_DEBUG_BUILD
ความพยายามใดๆ ในการกำหนดค่าคงที่เนมสเปซที่ตรงกับชื่อของค่าคงที่บิวท์อินแบบพิเศษจะส่งผลให้เกิดข้อผิดพลาดร้ายแรง
ตัวอย่าง #11 ค่าคงที่ที่ไม่ได้กำหนด
แถบเนมสเปซ ;
ค่าคอนทราสต์เป็นโมฆะ = 0 ; // ข้อผิดพลาดร้ายแรง;
const จริง = "โง่" ; // ข้อผิดพลาดร้ายแรงเช่นกัน;
// ฯลฯ
?>
7 ปีที่แล้ว
มีวิธีกำหนดค่าคงที่เนมสเปซที่เป็นค่าคงที่พิเศษในตัว โดยใช้ฟังก์ชันกำหนดและตั้งค่าพารามิเตอร์ตัวที่สาม case_insensitive เป็นเท็จ:
เนมสเปซ foo ;
กำหนด (__NAMESPACE__ . "\NULL" , 10 ); // กำหนดค่า NULL คงที่ในเนมสเปซปัจจุบัน
?>
ไม่จำเป็นต้องระบุเนมสเปซในการเรียกของคุณเพื่อกำหนด () เหมือนที่เกิดขึ้นตามปกติ
เนมสเปซ foo ;
กำหนด(INI_ALL, "บาร์"); // สร้างการแจ้งเตือน - ค่าคงที่ INI_ALL ที่กำหนดไว้แล้ว แต่:
กำหนด (__NAMESPACE__ . "\INI_ALL" , "bar" ); // กำหนดค่าคงที่ INI_ALL ในเนมสเปซปัจจุบัน
var_dump(INI_ALL); // จะแสดง string(3)"bar". ไม่มีอะไรที่ไม่ได้รับการตรวจสอบจนถึงตอนนี้ แต่:
กำหนด ("NULL", 10); // กำหนดค่า NULL คงที่ในเนมสเปซปัจจุบัน...
var_dump(โมฆะ); // จะแสดง 10
var_dump(null); // จะแสดงค่า NULL
?>
หากพารามิเตอร์ case_insensitive ถูกตั้งค่าเป็นจริง
เนมสเปซ foo ;
กำหนด (__NAMESPACE__ . "\NULL" , 10 , จริง ); // สร้างการแจ้งเตือน - ค่าคงที่คงที่ถูกกำหนดไว้แล้ว
?>
3 ปีที่ผ่านมา
เมื่อสร้างคลาสหรือเรียกใช้เมธอดสแตติกจากภายในเนมสเปซโดยใช้ตัวแปร คุณต้องจำไว้ว่าเมธอดเหล่านี้จำเป็นต้องมีเนมสเปซแบบเต็มเพื่อที่จะใช้งานคลาสที่เหมาะสม คุณไม่สามารถใช้นามแฝงหรือชื่อย่อได้ แม้ว่าจะถูกเรียกภายในเนมสเปซเดียวกันก็ตาม การละเลยที่จะคำนึงถึงสิ่งนี้อาจทำให้รหัสของคุณใช้คลาสที่ไม่ถูกต้อง ส่งข้อยกเว้นคลาสที่ขาดหายไปร้ายแรง หรือส่งข้อผิดพลาดหรือคำเตือน
ในกรณีเหล่านี้ คุณสามารถใช้ค่าคงที่เวทย์มนตร์ __NAMESPACE__ หรือระบุเนมสเปซเต็มและชื่อคลาสได้โดยตรง ฟังก์ชัน class_exists ยังต้องการเนมสเปซแบบเต็มและชื่อคลาส และสามารถใช้เพื่อให้แน่ใจว่าข้อผิดพลาดร้ายแรงจะไม่ถูกโยนทิ้งเนื่องจากคลาสที่หายไป
เนมสเปซ foo ;
คลาสบาร์(
การทดสอบฟังก์ชันคงที่สาธารณะ () (
กลับ get_call_class();
}
}
เนมสเปซ Foo\Foo;
คลาส Bar ขยาย \Foo \Bar (
}
Var_dump(แถบ::ทดสอบ()); // string(11) "Foo\Foo\Bar"
$bar = "ฟู\บาร์" ;
var_dump($bar::test()); // string(7) "Foo\Bar"
$บาร์ = __NAMESPACE__ "\บาร์" ;
var_dump($bar::test()); // string(11) "Foo\Foo\Bar"
$บาร์ = "บาร์" ;
var_dump($bar::test()); // ข้อผิดพลาดร้ายแรง: ไม่พบคลาส "Bar" หรือใช้คลาส \Bar ไม่ถูกต้อง
มีหลายกรณีที่ตัวแปรค่อนข้างไม่สะดวกที่จะใช้สำหรับการจัดเก็บถาวรของค่าเฉพาะใด ๆ ที่ไม่เปลี่ยนแปลงระหว่างการทำงานของโปรแกรม ค่าดังกล่าวอาจเป็นค่าคงที่ทางคณิตศาสตร์ เส้นทางไฟล์ รหัสผ่านต่างๆ เป็นต้น เพียงเพื่อจุดประสงค์เหล่านี้ PHP จึงจัดให้มีโครงสร้างเช่น
เป็นค่าที่ตั้งชื่อไว้ซึ่งจะไม่เปลี่ยนแปลงระหว่างการทำงานของโปรแกรม (สคริปต์)
ใน PHP ค่าคงที่ถูกกำหนดโดยฟังก์ชัน กำหนด()- ฟังก์ชันนี้มีรูปแบบดังต่อไปนี้:
กำหนด ($ชื่อ, $value, $case_sen), ที่ไหน:
$ชื่อ- ชื่อของค่าคงที่;
$value- ค่าคงที่;
$case_sen- พารามิเตอร์ทางเลือกของประเภทลอจิคัล
ระบุว่าตัวอักษรควรคำนึงถึงขนาดตัวพิมพ์ (จริง) หรือไม่ (เท็จ)
ตัวอย่างการกำหนดและการใช้ค่าคงที่ใน PHP:
php
เอคโค่ ไพ ;
// เอาท์พุต 3.14
?>
ถ้าเป็นพารามิเตอร์ $case_senเท่ากับ จริงจากนั้นล่ามจะคำนึงถึงกรณีของอักขระเมื่อทำงานกับค่าคงที่ โปรดทราบว่ามีการใช้ค่าคงที่โดยไม่มีเครื่องหมายนำหน้า $ .
ความแตกต่างระหว่างค่าคงที่และตัวแปร:
ค่าคงที่ไม่มีเครื่องหมายดอลลาร์นำหน้า ( $ );
ค่าคงที่สามารถกำหนดค่าได้โดยใช้ฟังก์ชันเท่านั้น กำหนด()ไม่ใช่โดยการกำหนดค่า
สามารถกำหนดและเข้าถึงค่าคงที่ได้ทุกที่โดยไม่คำนึงถึงขอบเขต
ค่าคงที่ไม่สามารถกำหนดหรือทำให้เป็นโมฆะได้หลังจากการประกาศครั้งแรก
ค่าคงที่จะมีได้เฉพาะค่าสเกลาร์เท่านั้น
การตรวจสอบการมีอยู่ของค่าคงที่
หากต้องการตรวจสอบการมีอยู่ของค่าคงที่ คุณสามารถใช้ฟังก์ชันได้ กำหนด()- ฟังก์ชันนี้ส่งคืน จริงถ้ามีการประกาศค่าคงที่ นี่คือตัวอย่าง:
php
// ประกาศค่าคงที่ pi
กำหนด ("pi" , 3.14 , จริง );
ถ้า (กำหนด ("pi" )== true ) echo "ค่าคงที่ pi ได้รับการประกาศแล้ว!";
// สคริปต์จะพิมพ์ "Constant pi ประกาศ!"
?>
PHP ค่าคงที่ที่กำหนดไว้ล่วงหน้า
ค่าคงที่ที่กำหนดไว้ล่วงหน้าต่อไปนี้มีอยู่ใน PHP:
PHP มีรายการค่าคงที่ที่กำหนดไว้ล่วงหน้าจำนวนมากสำหรับทุกสคริปต์ที่คุณเรียกใช้ ค่าคงที่เหล่านี้จำนวนมากถูกกำหนดโดยโมดูลต่างๆ และจะปรากฏก็ต่อเมื่อโมดูลเหล่านั้นพร้อมใช้งานผ่านการโหลดแบบไดนามิกหรือผ่านการประกอบแบบคงที่
มีค่าคงที่ที่กำหนดไว้ล่วงหน้าห้าค่าที่เปลี่ยนความหมายขึ้นอยู่กับบริบทที่ใช้ค่าคงที่เหล่านั้น ตัวอย่างเช่นค่าคงที่ __เส้น__ขึ้นอยู่กับบรรทัดในสคริปต์ที่ระบุค่าคงที่นี้ ค่าคงที่พิเศษไม่คำนึงถึงขนาดตัวพิมพ์และแสดงไว้ด้านล่าง:
ชื่อ | คำอธิบาย |
---|---|
__เส้น__ | บรรทัดปัจจุบันในไฟล์ |
__ไฟล์__ | เส้นทางแบบเต็มและชื่อของไฟล์ปัจจุบัน |
__ผบ.__ | ไดเร็กทอรีของไฟล์ หากใช้ภายในการรวม ไดเร็กทอรีของไฟล์ที่รวมไว้จะถูกส่งกลับ นี่เทียบเท่ากับ dirname(__FILE__) ชื่อไดเร็กทอรีนี้ไม่มีเครื่องหมายทับต่อท้าย เว้นแต่จะเป็นไดเร็กทอรีราก |
__การทำงาน__ | ชื่อฟังก์ชัน (เพิ่มใน PHP 4.3.0) |
__ระดับ__ | ชื่อชั้นเรียน (เพิ่มใน PHP 4.3.0) |
__ลักษณะ__ | ชื่อลักษณะ. ชื่อคุณลักษณะจะรวมถึงเนมสเปซที่ถูกประกาศไว้ด้วย (เช่น Foo\Bar) |
__วิธี__ | ชื่อของวิธีการเรียน (เพิ่มใน PHP 5.0.0) |
__เนมสเปซ__ | ชื่อของเนมสเปซปัจจุบัน |
นอกจากนี้
ในโพสต์นี้ เราจะมาดูความแตกต่างในการประกาศค่าคงที่ PHP โดยใช้คีย์เวิร์ด const และฟังก์ชัน Defin()
ค่าคงที่ใน PHP คือ "ค่าคงที่" ซึ่งระบุค่าเพียงครั้งเดียวแล้วไม่สามารถเปลี่ยนแปลงได้ หากคุณพยายามเปลี่ยนค่า ค่านั้นจะไม่เปลี่ยนแปลงและข้อความ PHP จะปรากฏขึ้น: “กำหนดไว้แล้วคงที่”:
Define("FOO", "val"); กำหนด("FOO", "val2"); // หมายเหตุ: ค่าคงที่ที่กำหนดไว้แล้ว echo FOO; //>วาล
มีสองวิธีในการประกาศค่าคงที่ใน PHP:
// 1 กำหนด ("NAME", "VALUE"); // 2 const NAME = "ค่า";
แต่ละวิธีมีลักษณะเฉพาะของตัวเอง เพื่อทำความเข้าใจ เรามาดูทุกอย่างทีละขั้นตอน อย่างไร และมีอะไรเปลี่ยนแปลงไปใน PHP แต่ละเวอร์ชัน
วิธีการสร้างค่าคงที่
PHP น้อยกว่า 5.3
ก่อนเวอร์ชัน 5.3 ใน PHP ค่าคงที่สามารถกำหนดค่าได้โดยใช้ Defin() เท่านั้น คำสำคัญ const ปรากฏในเวอร์ชัน 5.3
มีเพียงสเกลาร์เท่านั้นที่สามารถเก็บค่าคงที่ได้ ตัวแปรสเกลาร์เป็นตัวแปรที่มีประเภทจำนวนเต็ม ทศนิยม สตริง และบูลีน ประเภทอาร์เรย์ วัตถุ และทรัพยากรไม่ใช่สเกลาร์
// สเกลาร์กำหนด ("FOO", 10); กำหนด("FOO", 10.9); กำหนด("FOO", "val"); กำหนด("FOO", จริง); // ไม่ใช่สเกลาร์กำหนด ("FOO", อาร์เรย์ (1)); // ไม่ได้ตั้งค่าคงที่และเราได้รับคำเตือนกำหนด ("FOO", (วัตถุ) อาร์เรย์ (1)); // ไม่ได้ตั้งค่าคงที่และเราได้รับคำเตือน
จาก PHP 5.3
คีย์เวิร์ด const ปรากฏขึ้นแล้ว และตอนนี้ก็สามารถกำหนดค่าคงที่ได้โดยใช้คีย์เวิร์ดนั้น
อย่างไรก็ตาม ใน const คุณไม่สามารถระบุตัวแปร ฟังก์ชัน หรือนิพจน์บางประเภทได้ แต่คุณต้องส่งสเกลาร์ "โดยตรง":
ค่าคงที่ FOO = "val"; // ไม่มีข้อผิดพลาด const FOO = $var; // ข้อผิดพลาดในการแยกวิเคราะห์ const FOO = home_url(); // ข้อผิดพลาดในการแยกวิเคราะห์ const FOO = 5 + 10; // ข้อผิดพลาดในการแยกวิเคราะห์ const FOO = "foo"."bar"; // แยกวิเคราะห์ข้อผิดพลาด
ในขณะที่ Defin() ไม่มีข้อจำกัดดังกล่าว...
Define("FOO", "val"); // ไม่มีข้อผิดพลาดที่กำหนด ("FOO", $var); // ไม่มีข้อผิดพลาดกำหนด ("FOO", home_url()); // ไม่มีข้อผิดพลาดกำหนด ("FOO", 5 + 10); // ไม่มีข้อผิดพลาดกำหนด ("FOO", "foo"."bar"); //ไม่มีข้อผิดพลาด
พีเอชพี 5.6
มีความเป็นไปได้ที่จะระบุนิพจน์ PHP ดั้งเดิม (นิพจน์จากสเกลาร์) เป็นค่า const:
ค่าคงที่ FOO = 1 + 2; const FOO = "foo" "บาร์";
เป็นไปได้ที่จะจัดเก็บอาร์เรย์เป็นค่าคงที่:
ค่าคงที่ FOO = ; // งานกำหนด ("FOO", ); // ไม่ทำงานใน PHP 5.6 แต่ทำงานใน PHP 7.0
ความแตกต่างระหว่างกำหนด () และ const
ต้องประกาศ #1 const ในขอบเขตบนสุด
ไม่เหมือนกับกำหนด () ตรงที่ const จะต้องถูกประกาศที่ด้านบนสุดของขอบเขต เนื่องจากถูกกำหนดไว้เมื่อคอมไพล์สคริปต์ ซึ่งหมายความว่าไม่สามารถประกาศภายในคำสั่ง function/loops/if หรือ try/catch บล็อกได้
ถ้า (1) ( const NAME = "VALUE"; // ไม่ทำงาน ) // แต่ถ้า (1) ( กำหนด("NAME", "VALUE"); // ทำงาน )
#2 const จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ
const จะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เสมอ ในขณะที่ Defin() ให้คุณสร้างค่าคงที่ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่:
Define("NAME", "VALUE", จริง); สะท้อนชื่อ; // ชื่อเสียงสะท้อนมูลค่า; // ค่า
#3 const เข้าใจเฉพาะสเกลาร์เท่านั้น
สิ่งนี้ใช้ได้กับ PHP เวอร์ชัน 5.6 และต่ำกว่าเท่านั้น...
const ไม่สามารถส่งผ่านไปยังตัวแปร ฟังก์ชัน นิพจน์ได้ แต่กำหนด () สามารถเป็น:
ค่าคงที่ FOO = $var; // ข้อผิดพลาดในการแยกวิเคราะห์ const FOO = home_url(); // ข้อผิดพลาดในการแยกวิเคราะห์กำหนด ("FOO", $var); // ไม่มีข้อผิดพลาดกำหนด ("FOO", home_url()); //ไม่มีข้อผิดพลาด
#4 const สามารถจัดเก็บอาร์เรย์ตั้งแต่ PHP 5.6 และกำหนดตั้งแต่ PHP 7.0
const FOO = ; // ทำงานใน PHP 5.6 กำหนด ("FOO", ); // ไม่ทำงานใน PHP 5.6 แต่ทำงานใน PHP 7.0ผลการเปรียบเทียบ
เกือบทุกครั้งจะดีกว่าเสมอที่จะกำหนดค่าคงที่โดยใช้ Defin() เนื่องจากมีความเป็นไปได้มากกว่าและมีตัวเลือกน้อยกว่าในการ "จับ" ข้อผิดพลาด... ข้อยกเว้นคือเมื่อคุณมี PHP 5.6 และคุณต้องบันทึกอาร์เรย์ให้เป็นค่าคงที่ const จะช่วยที่นี่
ค่าคงที่คลาส PHP
มีการประกาศโดยใช้ const เท่านั้น กฎสำหรับสิ่งเหล่านี้เป็นไปตามที่อธิบายไว้ข้างต้น: ยอมรับเฉพาะสเกลาร์เท่านั้น ไม่เข้าใจตัวแปร PHP ฟังก์ชัน นิพจน์...
ค่าคงที่ของคลาสจะเป็นสาธารณะเสมอ - ไม่มีสถานะส่วนตัวหรือสถานะที่ได้รับการคุ้มครอง
ค่าคงที่ที่ประกาศเป็นของคลาสโดยเฉพาะ มันไม่ได้เป็นของวัตถุใด ๆ และเป็นเรื่องปกติของวัตถุทั้งหมด (อินสแตนซ์) ของคลาส
Class My_Class ( const NAME = "VALUE"; // เริ่มต้นด้วย PHP 5.6 คุณสามารถใช้นิพจน์ทางคณิตศาสตร์ const SEC_PER_DAY = 60 * 60 * 24; function print_name() ( // เข้าถึงค่าคงที่ของคลาสภายในเมธอดผ่าน self (คลาสนั้นเอง ) echo self ::NAME; ) ) // การเข้าถึงค่าคงที่ภายนอกคลาส // สามารถเรียกได้จากขอบเขตส่วนกลางโดยไม่ต้องเริ่มต้นอินสแตนซ์ของคลาส echo My_Class::NAME;
ค่าคงที่ของคลาสจะคล้ายกับคุณสมบัติของคลาสแบบคงที่มาก
คลาส My_Class ( const NAME = "VALUE"; static $name = "VALUE";; ) echo My_Class::NAME; เสียงสะท้อน My_Class::$name;
ค่าคงที่ "เวทมนตร์"
และโดยสรุป เรามาจำเกี่ยวกับค่าคงที่ PHP พิเศษกัน...
PHP มีค่าคงที่เวทย์มนตร์เก้าค่าที่เปลี่ยนความหมายขึ้นอยู่กับบริบทที่ใช้ ตัวอย่างเช่น ค่าของ __LINE__ ขึ้นอยู่กับบรรทัดในสคริปต์ที่ระบุค่าคงที่นี้ ค่าคงที่ "magic" ทั้งหมดได้รับการแก้ไข ณ เวลาคอมไพล์ ซึ่งแตกต่างจากค่าคงที่ปกติซึ่งได้รับการแก้ไข ณ รันไทม์ ค่าคงที่พิเศษไม่คำนึงถึงขนาดตัวพิมพ์และแสดงไว้ด้านล่าง:
คงที่ | คำอธิบาย |
---|---|
__เส้น__ | หมายเลขบรรทัดปัจจุบันในไฟล์ |
__ไฟล์__ | เส้นทางแบบเต็มและชื่อของไฟล์ปัจจุบันที่มีการเรียกค่าคงที่ |
__ผบ.__ | พีเอชพี 5.3.0 ไดเร็กทอรีของไฟล์ที่ใช้ค่าคงที่ เช่นเดียวกับ dirname(__FILE__) ไม่มีเครื่องหมายทับต่อท้าย ยกเว้นในไดเร็กทอรีราก |
__การทำงาน__ | ชื่อฟังก์ชัน |
__ระดับ__ | ชื่อชั้นเรียน ชื่อนี้ประกอบด้วยชื่อของเนมสเปซซึ่งมีการประกาศคลาส (เช่น Foo\Bar) ยังทำงานในลักษณะ เมื่อใช้ในวิธีลักษณะ นี่คือชื่อของคลาสที่ใช้วิธีการเหล่านี้ |
__ลักษณะ__ | พีเอชพี 5.4.0 ชื่อลักษณะ. ชื่อนี้ประกอบด้วยชื่อของเนมสเปซซึ่งมีการประกาศลักษณะ (เช่น Foo\Bar) |
__วิธี__ | ชื่อของวิธีการเรียน |
__เนมสเปซ__ | พีเอชพี 5.3.0 ชื่อของเนมสเปซปัจจุบัน |
ชื่อคลาส::คลาส | พีพี 5.5.0 ชื่อคลาสเต็ม (รวมถึงเนมสเปซ) ดูเพิ่มเติมที่::คลาส |
ค่าคงที่- นี่คือค่าที่ไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป แม้จะเรียนจากโรงเรียน คุณคงทราบค่าคงที่หลายอย่าง เช่น ตัวเลข n, ตัวเลข จความเร่งโน้มถ่วง และอื่นๆ และแน่นอนว่าเมื่อเขียนโปรแกรมก็มักจะต้องเข้าเช่นกัน ค่าคงที่- และเกี่ยวกับวิธีการ สร้างและใช้ค่าคงที่ใน PHPเราจะพูดถึงเรื่องนี้ในบทความนี้
ไปกับคุณกันเถอะ มาสร้างค่าคงที่กันดีกว่าตัวเลข n:
กำหนด (PI, 3.1415926);
เสียงสะท้อน PI;
?>
ผู้ดำเนินการ กำหนดสร้าง คงที่ พี.ไอ.และกำหนดค่าให้กับมัน 3.1415926 - ต่อไปเราจะส่งออกค่าคงที่นี้ผ่านตัวดำเนินการ เสียงสะท้อน- ทุกอย่างง่ายมาก แต่มีคำแนะนำหนึ่งข้อที่ฉันแนะนำให้คุณปฏิบัติตามเสมอ อย่าลืมเขียน ค่าคงที่เป็นตัวพิมพ์ใหญ่ ไม่ใช่ว่าจำเป็น แต่เป็นที่ต้องการอย่างมาก และนี่เป็นเรื่องปกติไม่เพียงแต่ในเท่านั้น PHPแต่เป็นภาษาอื่นด้วย
แน่นอนในภายหลัง เปลี่ยนค่าคงที่ PI จะไม่ได้รับอนุญาต (นั่นเป็นสาเหตุที่เธอ คงที่).
ตอนนี้เรามาดูฟังก์ชันหนึ่งที่ตรวจสอบ: " ค่าคงที่ที่กำหนดถูกกำหนดไว้หรือไม่?". มาเขียนสคริปต์นี้:
ถ้า (!กำหนด("PI")) กำหนด(PI, 3.1415926);
เสียงสะท้อน PI;
?>
ที่นี่ มีการตรวจสอบการมีอยู่ของค่าคงที่ พี.ไอ.- และถ้ามันไม่มีอยู่ (นั่นคือ ฟังก์ชันกำหนด()กลับมา เท็จ) จากนั้นเราจะกำหนดค่าเริ่มต้นให้กับค่าคงที่นี้ จากนั้นเราก็แสดงมันออกมา
อย่างที่คุณเห็นสร้างและใช้ของคุณ ค่าคงที่ใน PHP- มันง่ายมาก
และสุดท้ายนี้ผมอยากจะพูดถึง ค่าคงที่ PHP ในตัว- มาเขียนสคริปต์ง่ายๆ:
phpinfo();
?>
ในตอนท้ายมีส่วน " ตัวแปร PHP“อันที่จริงนี่ไม่ใช่ทั้งหมด ค่าคงที่อย่างไรก็ตาม พวกเขาก็เป็นเช่นนั้น ค่าคงที่เมื่อรันสคริปต์นี้ แน่นอนว่าเมื่อมีการเรียกใช้สคริปต์อื่น สคริปต์เหล่านั้นจะมีค่าที่แตกต่างกัน (ไม่ใช่ทั้งหมดแน่นอน) ขอพาคุณออกไปเป็นคู่รัก ค่าคงที่เพื่อให้คุณเข้าใจวิธีการทำงานร่วมกับสิ่งเหล่านี้ เนื่องจากมีการใช้บ่อยอย่างไม่น่าเชื่อ:
เสียงสะท้อน $_SERVER["REMOTE_ADDR"];
เสียงสะท้อน "
";
เสียงสะท้อน $_SERVER["QUERY_STRING"];
?>
ในสคริปต์นี้เราส่งออก ที่อยู่ IP ของผู้ใช้ซึ่งเปิดตัวสคริปต์ และในบรรทัดถัดไป เราจะแสดงสตริงการสืบค้น (เช่น " index.php?id=7") มองไปข้างหน้าอีกหน่อย ฉันบอกว่าที่นี่เรากำลังทำงานร่วมกับระดับโลก อาร์เรย์ $_SERVER- เราจะมาทำความรู้จักกับอาร์เรย์ในภายหลัง แต่ฉันคิดว่าผู้ที่เคยทำงานกับอาร์เรย์ในภาษาการเขียนโปรแกรมอื่นจะจดจำไวยากรณ์ได้โดยไม่มีปัญหาใด ๆ สำหรับคนอื่นๆ ค่าคงที่จากนั้นการทำงานร่วมกับพวกเขาก็เกิดขึ้นในลักษณะเดียวกัน
ในบันทึกนี้เราจะพูดถึงค่าคงที่ ตามปกติเรามาดูแนวคิดเรื่องค่าคงที่ในภาษาการเขียนโปรแกรมและดูวิธีการประกาศและใช้งาน ค่าคงที่ใน PHP.
แนวคิดเรื่องค่าคงที่และค่าคงที่ใน PHP
คำว่าคงที่น่าจะคุ้นเคยกับคุณจากคณิตศาสตร์แล้ว:
“ค่าคงที่ทางคณิตศาสตร์- ปริมาณที่มูลค่าไม่เปลี่ยนแปลง”
มันเหมือนกันใน PHP ค่าคงที่ใน PHPเป็นตัวระบุที่ทำหน้าที่กำหนดค่าอย่างง่าย (สตริง ตัวเลขบางตัว) ที่ไม่สามารถเปลี่ยนแปลงระหว่างการเรียกใช้โค้ด
หากต้องการประกาศค่าคงที่ (กำหนดค่าให้) ให้ใช้ฟังก์ชัน กำหนด- ตัวอย่างการประกาศอย่างต่อเนื่อง:
ชื่อคงที่ใน PHP จะต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กต่างกัน) ดังนั้นคุณต้องระมัดระวัง นอกจากนี้ยังมีแบบแผนว่าชื่อคงที่จะเขียนด้วยตัวพิมพ์ใหญ่เสมอ
ชื่อคงที่ต้องขึ้นต้นด้วยตัวอักษรหรือขีดล่าง “_” และประกอบด้วยตัวอักษร ตัวเลข และขีดล่างได้
ลองดูตัวอย่างง่ายๆ ของการใช้ค่าคงที่:
ในตัวอย่างนี้ เราประกาศค่าคงที่และใช้ในโปรแกรม
ค่าคงที่มีไว้เพื่ออะไร และการใช้ตัวแปรง่ายกว่าไหม?
ดังที่ได้กล่าวไปแล้ว ค่าคงที่ไม่สามารถเปลี่ยนค่าระหว่างการทำงานของโปรแกรมได้ ค่าคงที่มักจะจัดเก็บพารามิเตอร์ของไซต์ถาวร เช่น รายละเอียดการเข้าถึงฐานข้อมูล (โฮสต์ การเข้าสู่ระบบและรหัสผ่านของผู้ใช้ ชื่อฐานข้อมูล) ตำแหน่งของไซต์บนดิสก์ และการตั้งค่าอื่น ๆ อีกมากมาย
หากเราใช้ตัวแปร สคริปต์อาจเปลี่ยนค่าของตัวแปรโดยไม่ตั้งใจ (ในกรณีที่มีข้อผิดพลาด) และจะไม่ทำงานตามที่คุณต้องการ
การใช้ค่าคงที่ช่วยให้แน่ใจว่าค่าที่คุณระบุเมื่อประกาศค่าคงที่จะไม่เปลี่ยนแปลง