เนมสเปซ
การเปลี่ยนแปลงที่ใหญ่ที่สุดใน PHP 5.3 คือ Namespaces อย่างไม่ต้องสงสัย (เคยมีคำถามที่พบบ่อยเกี่ยวกับ PHP Namespaces มาก่อน) สิ่งนี้นำมาซึ่งประโยชน์มากมายสำหรับนักพัฒนา PHP และปัญหาการตั้งชื่อฟังก์ชันที่ได้รับการวิพากษ์วิจารณ์อย่างกว้างขวางก็ได้รับการแก้ไขเช่นกัน
รหัสมีความชัดเจนมากขึ้น
รหัสทั่วไปก่อนเวอร์ชัน 5.3 ต้องใช้คำนำหน้าที่กำหนดเองเพื่อแยกฟังก์ชันและชื่อคลาสPLAIN
TEXT
CODE:
function MY_wrapper() {}
คลาส MY_DB { }
กำหนด('MY_CONN_STR', '');
MY_wrapper();
ใหม่ MY_DB();
MY_CONN_STR;
หลังจากใช้เนมสเปซ โค้ดจะดูสะอาดตายิ่งขึ้น
รหัสข้อความธรรมดา
:
เนมสเปซ MY;
ตัวห่อฟังก์ชัน () {}
คลาสฐานข้อมูล { }
const CONN_STR = '';
ใช้ของฉันเป็นของฉัน;
กระดาษห่อ();
ฐานข้อมูลใหม่();
CONN_STR;
เนมสเปซหลายรายการที่กำหนดไว้ในไฟล์เดียว
ควรทำอย่างไรหากมีการกำหนดเนมสเปซหลายรายการในไฟล์เดียว
รหัส
ข้อความธรรมดา
:เนมสเปซ LIB;
คลาส MySQL {}
คลาส SQLite {}
$b = SQLite ใหม่();
เนมสเปซ LIB_EXTRA;
คลาส MScrypt {}
$a = MScrypt ใหม่();
var_dump(
get_class($a)
get_class($ข)
-
ผลลัพธ์ของโค้ดด้านบนคือ:
PLAIN TEXT
CODE:
string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
PHP เป็นภาษาสำหรับการตีความและการดำเนินการ และผลลัพธ์ข้างต้นก็สมเหตุสมผล
ลำดับความสำคัญของเนมสเปซ
ฟังก์ชัน คลาส และค่าคงที่ที่กำหนดไว้ในเนมสเปซจะมีความสำคัญ ตามมาด้วยโกลบอล
รหัส
ข้อความธรรมดา
:เนมสเปซ foo;
ฟังก์ชั่น strlen($foo) { return htmlentities($foo) }
echo strlen("ทดสอบ"); // test
echo ::strlen("ทดสอบ"); // 4
echo เนมสเปซ::strlen("test"); // test
มิตรภาพระหว่างเนมสเปซและการโหลดอัตโนมัติ
autoload จะแยกวิเคราะห์ตำแหน่งไฟล์คลาสตามชื่อเนมสเปซและชื่อคลาส Autoload จะถูกทริกเกอร์เฉพาะเมื่อไม่พบคำจำกัดความของคลาสในเนมสเปซและขอบเขตส่วนกลางที่กำหนดในเนมสเปซจะไม่ถูกเรียกโดยอัตโนมัติ
ข้อความธรรมดา
รหัส:
ฟังก์ชั่น __autoload($var) { var_dump($var); } // LIB::foo
ต้องการ "./ns.php"; /*
<?php
เนมสเปซ LIB;
ใหม่ foo();
-
เนมสเปซอุปกรณ์เสริมบางอย่าง
ข้อความธรรมดา
:
เนมสเปซจริงๆ::ยาว::ไม่มีจุดหมาย::verbose::ns;
__NAMESPACE__; // ค่าคงที่เวทย์มนตร์ใหม่ที่แสดงชื่อเนมสเปซปัจจุบัน
คลาส ก{}
get_class(ใหม่ a()); // จริงๆ::ยาว::ไม่มีจุดหมาย::verbose::ns::a
use really::long::pointlessly::verbose::ns::a AS b;// อ้างอิงคลาสจากเนมสเปซ หมายเหตุ: เนื้อหาที่นี่คัดลอกมาจาก pdfIntroduction to PHP 5.3 Slides และจะไม่ทำซ้ำในภายหลัง
การปรับปรุงประสิทธิภาพ
ประสิทธิภาพโดยรวมของ php 5.3 ได้รับการปรับปรุง 5-15%
และ md5() เร็วขึ้น 10-15%
การใช้งานสแต็กที่ดีขึ้นในเครื่องยนต์
ค่าคงที่ถูกย้ายไปยังหน่วยความจำแบบอ่านอย่างเดียว
การปรับปรุงกระบวนการจัดการข้อยกเว้น (ลดความซับซ้อน, opcodes น้อยลง)
(ต้องการ/รวม)_เมื่อปรับปรุงแล้ว ให้ลบการเปิดที่ซ้ำกันออก
ขนาดไบนารี่เล็กลง & ขนาดเริ่มต้นด้วย gcc4
คุณสมบัติภาษาใหม่__DIR__
ก่อนเวอร์ชัน 5.3 เพื่อให้ได้ไดเร็กทอรีของสคริปต์ปัจจุบัน จำเป็นต้องมีการเรียกใช้ฟังก์ชัน
: PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
ใน 5.3 จำเป็นต้องใช้ค่าคงที่เวทย์มนตร์ __DIR__ เพียงค่าเดียวเท่านั้น
รหัส
ข้อความธรรมดา
:echo __DIR__; // >= PHP 5.3
?:ตัวดำเนินการ ที่สะดวก ?:ตัวดำเนินการสามารถรับค่าที่ไม่ใช่ค่าว่างได้อย่างรวดเร็วจากสองค่า/นิพจน์
รหัส
ข้อความธรรมดา
:$a = true ?: false; // true
$a = false ?: จริง; // จริง
$a = "" ?: 1; // 1
$a = 0 ?: 2; // 2
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a"); // 1
__โทรคงที่()
มีการเพิ่มเมธอดเวทย์มนตร์ใหม่ __callStatic ฟังก์ชั่นของมันคล้ายกับ __call แต่ใช้ได้กับเมธอดแบบคงที่เท่านั้น
ข้อความธรรมดา
:
ผู้ช่วยชั้นเรียน {
ฟังก์ชันคงที่ __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
-
-
ผู้ช่วย::test("foo", "bar"); // test(foo,bar)
เรียกวิธีคงที่แบบไดนามิก การผสมผสานระหว่างการเคลื่อนไหวและความนิ่ง
ข้อความธรรมดา
:
ผู้ช่วยชั้นเรียน {
ฟังก์ชั่นคงที่ foo () { echo __METHOD__;
-
$a = "ผู้ช่วย";
$b = "ฟู";
$a::$b(); // ผู้ช่วย::foo
การผูกแบบคงที่ล่าช้า
ฉันไม่รู้วิธีแปลบางทีมันอาจจะง่ายกว่าที่จะเข้าใจถ้าฉันทิ้งข้อความต้นฉบับไว้ ระยะเวลาการประมวลผลเหตุการณ์ของวิธีคงที่มีการเปลี่ยนแปลง
ก่อน PHP 5.3 โค้ดต่อไปนี้จะส่งเอาต์พุต A แต่นี่ไม่ใช่สิ่งที่เราต้องการ วิธี whoami ได้รับการแก้ไขใหม่ในคลาส B ซึ่งควรส่งออก B เพื่อให้สอดคล้องกับสิ่งที่เรายอมรับ
รหัสข้อความธรรมดา
:
คลาส A {
ฟังก์ชันคงที่สาธารณะ whoami () {
เสียงสะท้อน __คลาส__;
-
ข้อมูลประจำตัวฟังก์ชันคงที่สาธารณะ () {
ตัวเอง::whoami();
-
-
คลาส B ขยาย A {
ฟังก์ชันคงที่สาธารณะ whoami () {
เสียงสะท้อน __คลาส__;
-
-
B::identity(); // A <-- PHP <5.3
รหัสต่อไปนี้ใช้ static::whoami() เพื่อเรียกวิธีการคงที่ หลังจาก PHP 5.3 เนื่องจาก __CLASS__ ได้รับการประมวลผลระหว่างการดำเนินการ จึงสามารถจับคลาส B ได้สำเร็จในตัวอย่างนี้
ข้อความธรรมดา
:
คลาส A {
ฟังก์ชันคงที่สาธารณะ whoami () {
เสียงสะท้อน __คลาส__;
-
ข้อมูลประจำตัวฟังก์ชันคงที่สาธารณะ () {
คงที่::whoami();
-
-
คลาส B ขยาย A {
ฟังก์ชันคงที่สาธารณะ whoami () {
เสียงสะท้อน __คลาส__;
-
-
B::identity(); // B <-->= PHP 5.3
mysqlnd
ดูว่า mysqlnd กลายเป็นไดรเวอร์ mysql เริ่มต้นใน PHP 5.3
แต่ PDO_MySQL ยังไม่รองรับ mysqlnd ในปัจจุบัน มีเพียงส่วนขยาย mysql(i) เท่านั้นที่สามารถใช้
คุณสมบัติใหม่ของ PHP 5.3 ที่เปิดตัวก่อนหน้านี้ ซึ่งทั้งหมดนี้สะดวกสำหรับนักพัฒนา นี่คือคุณสมบัติที่ผู้ให้บริการเว็บโฮสติ้งชอบมาก
การสนับสนุนไฟล์ ini ที่ได้รับการปรับปรุง
CGI/FastCGI รองรับการกำหนดค่า INI คล้ายกับ .htaccess แต่ละไดเร็กทอรีสามารถมีการตั้งค่า INI ได้ ชื่อไฟล์ของ ini ขึ้นอยู่กับการกำหนดค่าของ php.ini แต่ [PATH=/var/www/domain.com], [HOST=www ผู้ใช้ไม่สามารถแก้ไขการตั้งค่าส่วน .domain.com] ได้
ปรับปรุงการจัดการข้อผิดพลาด
อนุญาตให้กำหนดตัวแปรและค่าคงที่ในไฟล์ ini และสามารถเรียกใช้ได้โดยตรงในโปรแกรม
สิ่งที่แนบมาด้วยคือตัวอย่างของไฟล์ ini
PLAIN TEXT
CODE:
#User-Defined php.ini file name (.htaccess) ค่าเริ่มต้นคือ ".user.ini"
user_ini.filename=".user.ini"
#หากคุณต้องการปิดการใช้งานคุณสมบัตินี้ ให้ตั้งค่าเป็นค่าว่าง
user_ini.ชื่อไฟล์=
#ความยาวไฟล์ TTL ของไฟล์ php.ini ที่ผู้ใช้กำหนด (เวลาที่ใช้งาน) มีหน่วยเป็นวินาที ฉันเข้าใจว่าเป็นเวลาหมดอายุของแคช ค่าเริ่มต้นคือ 300 วินาที
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
ตัวแปร_ลำดับ = GPC
เซฟโหมด =1
[ตัวแปรของฉัน]
บ้าง = "1234"
anothervar = ${somevar}; anothervar == บ้าง
[อาร์เรย์ ini]
ฟู[บาร์]=1
ฟู[123]=2
ฟู[]=3