การใช้คุณสมบัติภาษาใหม่ของ PHP V5 ทำให้สามารถปรับปรุงการบำรุงรักษาและความน่าเชื่อถือของโค้ดได้อย่างมาก เมื่ออ่านบทความนี้ คุณจะได้เรียนรู้วิธีใช้ประโยชน์จากคุณสมบัติใหม่เหล่านี้เพื่อย้ายโค้ดที่พัฒนาใน PHP V4 ไปยัง PHP V5
PHP V5 ได้ทำการปรับปรุงที่สำคัญโดยใช้ PHP V4 คุณสมบัติภาษาใหม่ช่วยให้สร้างและบำรุงรักษาไลบรารีคลาสที่เชื่อถือได้ได้ง่ายขึ้น นอกจากนี้ การเขียนไลบรารีมาตรฐานใหม่ยังช่วยให้ PHP สอดคล้องกับสำนวนเว็บอื่นๆ มากขึ้น เช่น ภาษาการเขียนโปรแกรม Java™ มาดูคุณสมบัติเชิงวัตถุใหม่ของ PHP และเรียนรู้วิธีโยกย้ายโค้ด PHP V4 ที่มีอยู่ไปยัง PHP V5
ก่อนอื่น เรามาดูกันว่าฟีเจอร์ภาษาใหม่และผู้สร้าง PHP ได้เปลี่ยนแปลงวิธีการสร้างออบเจ็กต์ด้วย PHP V4 อย่างไร แนวคิดสำหรับ V5 คือการสร้างภาษาที่แข็งแกร่งทางอุตสาหกรรมสำหรับการพัฒนาแอปพลิเคชันเว็บ นั่นหมายถึงการเข้าใจข้อจำกัดของ PHP V4 จากนั้นแยกสถาปัตยกรรมภาษาที่ดีที่เป็นที่รู้จักออกจากภาษาอื่นๆ (เช่น Java, C#, C++, Ruby และ Perl) และรวมเข้ากับ PHP
คุณสมบัติใหม่แรกและสำคัญที่สุดคือการป้องกันการเข้าถึงสำหรับวิธีคลาสและตัวแปรอินสแตนซ์ - คำหลักสาธารณะ, ที่ได้รับการป้องกันและส่วนตัว คุณสมบัติใหม่นี้ช่วยให้ผู้ออกแบบคลาสสามารถควบคุมคุณสมบัติที่แท้จริงของคลาสในขณะที่บอกผู้ใช้คลาสว่าคลาสใดที่สามารถเข้าถึงได้และคลาสใดที่ไม่สามารถเข้าถึงได้
ใน PHP V4 โค้ดทั้งหมดเป็นแบบสาธารณะ ใน PHP V5 ผู้ออกแบบคลาสสามารถประกาศได้ว่าโค้ดใดที่เปิดเผยต่อโลกภายนอก (สาธารณะ) และโค้ดใดที่มองเห็นได้เฉพาะภายในคลาส (ส่วนตัว) หรือเฉพาะคลาสย่อยของคลาส (ที่ได้รับการป้องกัน) หากไม่มีการควบคุมการเข้าถึงเหล่านี้ การพัฒนาโค้ดในทีมขนาดใหญ่หรือการกระจายโค้ดเป็นไลบรารีจะถูกขัดขวาง เนื่องจากผู้ใช้คลาสเหล่านั้นมีแนวโน้มที่จะใช้วิธีการที่ไม่ถูกต้องหรือโค้ดการเข้าถึงที่ควรเป็นตัวแปรสมาชิกส่วนตัว
คุณสมบัติใหม่ที่สำคัญอีกประการหนึ่งคืออินเทอร์เฟซคำหลักและบทคัดย่อ ซึ่งช่วยให้สามารถเขียนโปรแกรมสัญญาได้ การเขียนโปรแกรมตามสัญญาหมายความว่าคลาสหนึ่งจัดทำสัญญาให้กับอีกคลาสหนึ่ง - หรืออีกนัยหนึ่ง: "นี่คือสิ่งที่ฉันจะทำ และคุณไม่จำเป็นต้องรู้ว่ามันเสร็จสิ้นอย่างไร" คลาสทั้งหมดที่ใช้อินเทอร์เฟซเป็นไปตามสัญญานี้ ผู้ใช้อินเทอร์เฟซทั้งหมดตกลงที่จะใช้เฉพาะวิธีการที่ระบุไว้ในอินเทอร์เฟซเท่านั้น คีย์เวิร์ด abstract ทำให้การทำงานกับอินเทอร์เฟซเป็นเรื่องง่ายมาก ดังที่ฉันจะอธิบายในภายหลัง
คุณสมบัติหลักทั้งสองนี้ - การควบคุมการเข้าถึงและการเขียนโปรแกรมตามสัญญา - ช่วยให้ทีมผู้เขียนโค้ดขนาดใหญ่ทำงานได้อย่างราบรื่นยิ่งขึ้นด้วยฐานโค้ดขนาดใหญ่ คุณลักษณะเหล่านี้ยังช่วยให้ IDE สามารถจัดเตรียมชุดคุณลักษณะอัจฉริยะทางภาษาที่สมบูรณ์ยิ่งขึ้น บทความนี้ไม่เพียงแต่กล่าวถึงปัญหาการย้ายข้อมูลหลายประการ แต่ยังใช้เวลาอธิบายวิธีใช้ฟีเจอร์ภาษาหลักใหม่เหล่านี้ด้วย
การควบคุมการเข้าถึง
เพื่อสาธิตคุณสมบัติภาษาใหม่ ฉันใช้คลาสที่เรียกว่าการกำหนดค่า คลาสแบบง่ายนี้มีรายการการกำหนดค่าสำหรับเว็บแอปพลิเคชัน - ตัวอย่างเช่น เส้นทางไปยังไดเร็กทอรีรูปภาพ ตามหลักการแล้ว ข้อมูลนี้จะอยู่ในไฟล์หรือฐานข้อมูล รายการ 1 แสดงเวอร์ชันที่เรียบง่าย
รายการ 1. access.php4
<?php
การกำหนดค่าคลาส
-
var $_items = array();
ฟังก์ชัน การกำหนดค่า() {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
ฟังก์ชั่นรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
$c = การกำหนดค่าใหม่();
echo( $c->get( 'imgpath' )."n" );
-
นี่คือคลาส PHP V4 ออร์โธดอกซ์ที่สมบูรณ์ ตัวแปรสมาชิกเก็บรายการของรายการการกำหนดค่า ตัวสร้างโหลดรายการ และวิธีการเข้าถึงชื่อ get() ส่งคืนค่าของรายการ
หลังจากรันสคริปต์แล้ว โค้ดต่อไปนี้จะปรากฏบนบรรทัดคำสั่ง:
%php access.php4
ภาพ
-
ดีมาก! ผลลัพธ์นี้หมายความว่าโค้ดทำงานตามปกติและค่าของรายการการกำหนดค่า imgpath ได้รับการตั้งค่าและอ่านได้ตามปกติ
ขั้นตอนแรกในการแปลงคลาสนี้เป็น PHP V5 คือการเปลี่ยนชื่อตัวสร้าง ใน PHP V5 วิธีการเริ่มต้นวัตถุ (ตัวสร้าง) เรียกว่า __construct การเปลี่ยนแปลงเล็กๆ น้อยๆ นี้แสดงอยู่ด้านล่าง
รายการ 2. access1.php5
<?php
การกำหนดค่าคลาส
-
var $_items = array();
ฟังก์ชั่น __construct() {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
ฟังก์ชั่นรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
$c = การกำหนดค่าใหม่();
echo( $c->get( 'imgpath' )."n" );
-
การเปลี่ยนแปลงในครั้งนี้ไม่ใหญ่นัก เพิ่งย้ายไปยังการประชุม PHP V5 ขั้นตอนต่อไปคือการเพิ่มการควบคุมการเข้าถึงให้กับคลาสเพื่อให้แน่ใจว่าผู้ใช้ของคลาสไม่สามารถอ่านและเขียนตัวแปรสมาชิก $_items ได้โดยตรง การเปลี่ยนแปลงนี้แสดงอยู่ด้านล่าง
รายการ 3. access2.php5
<?php
การกำหนดค่าคลาส
-
ส่วนตัว $_items = array();
ฟังก์ชั่นสาธารณะ __construct() {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
ฟังก์ชั่นสาธารณะรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
$c = การกำหนดค่าใหม่();
echo( $c->get( 'imgpath' )."n" );
-
หากผู้ใช้ของออบเจ็กต์นี้เข้าถึงอาร์เรย์รายการโดยตรง การเข้าถึงจะถูกปฏิเสธเนื่องจากอาร์เรย์ถูกทำเครื่องหมายเป็นส่วนตัว โชคดีที่ผู้ใช้ค้นพบว่าเมธอด get() ให้สิทธิ์ในการอ่านที่ยินดีเป็นอย่างยิ่ง
เพื่ออธิบายวิธีใช้สิทธิ์ที่ได้รับการป้องกัน ฉันต้องการคลาสอื่นซึ่งจะต้องสืบทอดมาจากคลาสการกำหนดค่า ฉันเรียกคลาสนั้น DBConfiguration และสันนิษฐานว่าคลาสจะอ่านค่าการกำหนดค่าจากฐานข้อมูล การตั้งค่านี้แสดงไว้ด้านล่าง
รายการ 4. access3.php
<?php
การกำหนดค่าคลาส
-
ป้องกัน $_items = array();
ฟังก์ชั่นสาธารณะ __construct() {
$นี่->โหลด();
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () { }
ฟังก์ชั่นสาธารณะรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
คลาส DBConfiguration ขยายการกำหนดค่า
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
}
$c = DBConfiguration ใหม่();
echo( $c->get( 'imgpath' )."n" );
-
รายการนี้แสดงการใช้งานที่ถูกต้องของคำสำคัญที่มีการป้องกัน คลาสพื้นฐานกำหนดวิธีการชื่อ load() คลาสย่อยของคลาสนี้จะแทนที่วิธี load() เพื่อเพิ่มข้อมูลลงในตารางรายการ เมธอด load() อยู่ภายในคลาสและคลาสย่อย ดังนั้นเมธอดนี้จึงไม่ปรากฏแก่ผู้บริโภคภายนอกทั้งหมด หากคีย์เวิร์ดเป็นแบบส่วนตัวทั้งหมด เมธอด load() จะไม่สามารถแทนที่ได้
ฉันไม่ชอบการออกแบบนี้มากนัก แต่ฉันเลือกมันเพราะฉันต้องให้คลาส DBConfiguration เข้าถึงอาร์เรย์รายการได้ ฉันต้องการให้อาร์เรย์รายการได้รับการดูแลโดยคลาสการกำหนดค่าต่อไป เพื่อที่เมื่อมีการเพิ่มคลาสย่อยอื่นๆ คลาสเหล่านั้นจะไม่จำเป็นต้องทราบวิธีดูแลรักษาอาร์เรย์รายการ ฉันทำการเปลี่ยนแปลงต่อไปนี้
รายการ 5. access4.php5
<?php
การกำหนดค่าคลาส
-
ส่วนตัว $_items = array();
ฟังก์ชั่นสาธารณะ __construct() {
$นี่->โหลด();
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () { }
เพิ่มฟังก์ชันที่ได้รับการป้องกัน ( $key, $value ) {
$this->_items[ $key ] = $value;
-
ฟังก์ชั่นสาธารณะรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
คลาส DBConfiguration ขยายการกำหนดค่า
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () {
$this->add( 'imgpath', 'images' );
-
}
$c = DBConfiguration ใหม่();
echo( $c->get( 'imgpath' )."n" );
-
ขณะนี้อาร์เรย์ของรายการสามารถเป็นแบบส่วนตัวได้เนื่องจากคลาสย่อยใช้เมธอด add() ที่มีการป้องกันเพื่อเพิ่มรายการการกำหนดค่าลงในรายการ คลาสการกำหนดค่าสามารถเปลี่ยนวิธีการจัดเก็บและอ่านรายการการกำหนดค่าโดยไม่คำนึงถึงคลาสย่อย ตราบใดที่เมธอด load() และ add() ทำงานในลักษณะเดียวกัน คลาสย่อยก็น่าจะไม่มีปัญหา
สำหรับฉัน การควบคุมการเข้าถึงที่เพิ่มเข้ามาเป็นเหตุผลหลักในการพิจารณาเปลี่ยนไปใช้ PHP V5 เป็นเพียงเพราะ Grady Booch บอกว่า PHP V5 เป็นหนึ่งในสี่ภาษาเชิงวัตถุหลักใช่หรือไม่ ไม่ เพราะครั้งหนึ่งฉันเคยยอมรับงานที่ต้องรักษาโค้ด C++ 100KLOC ซึ่งเมธอดและสมาชิกทั้งหมดถูกกำหนดให้เป็นสาธารณะ ฉันใช้เวลาสามวันในการล้างคำจำกัดความเหล่านี้ และในกระบวนการนี้ ฉันลดจำนวนข้อผิดพลาดและปรับปรุงการบำรุงรักษาได้อย่างมาก ทำไม เนื่องจากหากไม่มีการควบคุมการเข้าถึง จึงเป็นไปไม่ได้ที่จะทราบว่าวัตถุใช้วัตถุอื่นอย่างไร และเป็นไปไม่ได้ที่จะทำการเปลี่ยนแปลงใดๆ โดยไม่รู้ว่าจะต้องเอาชนะอุปสรรคใดบ้าง ด้วย C ++ อย่างน้อยฉันก็ยังมีคอมไพเลอร์อยู่ PHP ไม่ได้มาพร้อมกับคอมไพเลอร์ ดังนั้นการควบคุมการเข้าถึงประเภทนี้จึงมีความสำคัญมากยิ่งขึ้น
การเขียนโปรแกรมตามสัญญา
คุณลักษณะสำคัญถัดไปที่จะใช้ประโยชน์เมื่อย้ายจาก PHP V4 ไปเป็น PHP V5 คือการสนับสนุนการเขียนโปรแกรมตามสัญญาผ่านอินเทอร์เฟซ คลาสนามธรรม และวิธีการ รายการ 6 แสดงเวอร์ชันของคลาสการกำหนดค่าที่ผู้เขียนโค้ด PHP V4 พยายามสร้างอินเทอร์เฟซพื้นฐานโดยไม่ต้องใช้คีย์เวิร์ดอินเทอร์เฟซเลย
รายการ 6. interface.php4
<?php
การกำหนดค่าคลาส I
-
ฟังก์ชั่นรับ ( $key ) { }
}
การกำหนดค่าคลาสขยาย IConfiguration
-
var $_items = array();
ฟังก์ชัน การกำหนดค่า() {
$นี่->โหลด();
-
โหลดฟังก์ชัน () { }
ฟังก์ชั่นรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
คลาส DBConfiguration ขยายการกำหนดค่า
-
โหลดฟังก์ชัน () {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
}
$c = DBConfiguration ใหม่();
echo( $c->get( 'imgpath' )."n" );
-
รายการเริ่มต้นด้วยคลาส IConfiguration ขนาดเล็กที่กำหนดอินเทอร์เฟซทั้งหมดที่มีให้โดยคลาส Configuration หรือคลาสที่ได้รับ อินเทอร์เฟซนี้จะกำหนดสัญญาระหว่างคลาสและผู้ใช้ทั้งหมด สัญญาระบุว่าคลาสทั้งหมดที่ใช้ IConfiguration จะต้องติดตั้งเมธอด get() และผู้ใช้ IConfiguration ทุกคนจะต้องยืนยันที่จะใช้เฉพาะเมธอด get() เท่านั้น
โค้ดด้านล่างทำงานใน PHP V5 แต่จะดีกว่าถ้าใช้ระบบอินเทอร์เฟซที่ให้มาดังที่แสดงด้านล่าง
รายการ 7. interface1.php5
<?php
อินเทอร์เฟซการกำหนดค่า I
-
ฟังก์ชั่นรับ( $key );
}
การกำหนดค่าคลาสใช้ IConfiguration
-
-
}
คลาส DBConfiguration ขยายการกำหนดค่า
-
-
}
$c = DBConfiguration ใหม่();
echo( $c->get( 'imgpath' )."n" );
-
ในด้านหนึ่ง ผู้อ่านสามารถเข้าใจสถานะการทำงานได้ชัดเจนยิ่งขึ้น ในทางกลับกัน คลาสเดียวสามารถใช้หลายอินเทอร์เฟซได้ รายการ 8 แสดงวิธีการขยายคลาสการกำหนดค่าเพื่อใช้อินเทอร์เฟซ Iterator ซึ่งเป็นอินเทอร์เฟซภายในสำหรับ PHP
รายการ 8. interface2.php5
<?php
อินเทอร์เฟซการกำหนดค่า IConfiguration {
-
}
การกำหนดค่าคลาสใช้ IConfiguration, Iterator
-
ส่วนตัว $_items = array();
ฟังก์ชั่นสาธารณะ __construct() {
$นี่->โหลด();
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () { }
เพิ่มฟังก์ชันที่ได้รับการป้องกัน ( $key, $value ) {
$this->_items[ $key ] = $value;
-
ฟังก์ชั่นสาธารณะรับ ( $key ) {
กลับ $this->_items[ $key ];
}
ฟังก์ชันสาธารณะ ย้อนกลับ() { รีเซ็ต($this->_items); }
ฟังก์ชั่นสาธารณะ current() { กลับปัจจุบัน($this->_items); }
ปุ่มฟังก์ชันสาธารณะ () { ปุ่มส่งคืน ($ this-> _items); }
ฟังก์ชั่นสาธารณะ ถัดไป() { กลับถัดไป($this->_items); }
ฟังก์ชั่นสาธารณะถูกต้อง() { กลับ ( $this->ปัจจุบัน() !== false }
}
คลาส DBConfiguration ขยายการกำหนดค่า {
-
}
$c = DBConfiguration ใหม่();
foreach( $c เป็น $k => $v ) { echo( $k." = ".$v."n" );
-
อินเทอร์เฟซ Iterator ช่วยให้คลาสใดๆ ดูเหมือนเป็นอาร์เรย์ของผู้บริโภค ดังที่คุณเห็นในตอนท้ายของสคริปต์ คุณสามารถใช้ตัวดำเนินการ foreach เพื่อย้ำรายการการกำหนดค่าทั้งหมดในออบเจ็กต์การกำหนดค่า PHP V4 ไม่มีฟังก์ชันนี้ แต่คุณสามารถใช้ฟังก์ชันนี้ได้หลายวิธีภายในแอปพลิเคชันของคุณ
ข้อดีของกลไกอินเทอร์เฟซคือสามารถรวบรวมสัญญาได้อย่างรวดเร็วโดยไม่ต้องใช้วิธีการใดๆ ขั้นตอนสุดท้ายคือการใช้อินเทอร์เฟซ ซึ่งคุณต้องใช้วิธีการที่ระบุทั้งหมด คุณสมบัติใหม่ที่มีประโยชน์อีกประการหนึ่งใน PHP V5 คือคลาสนามธรรม ซึ่งทำให้ง่ายต่อการใช้งานส่วนหลักของอินเทอร์เฟซกับคลาสพื้นฐาน จากนั้นใช้อินเทอร์เฟซนั้นเพื่อสร้างคลาสเอนทิตี
การใช้คลาสนามธรรมอีกประการหนึ่งคือการสร้างคลาสพื้นฐานสำหรับคลาสที่ได้รับหลายคลาสโดยที่คลาสฐานจะไม่ถูกสร้างอินสแตนซ์ ตัวอย่างเช่น เมื่อ DBConfiguration และ Configuration มีอยู่พร้อมกัน จะสามารถใช้ได้เฉพาะ DBConfiguration เท่านั้น คลาสการกำหนดค่าเป็นเพียงคลาสพื้นฐาน - คลาสนามธรรม ดังนั้น คุณสามารถบังคับพฤติกรรมนี้ได้โดยใช้คำสำคัญ abstract ดังที่แสดงด้านล่าง
รายการ 9. abstract.php5
<?php
การกำหนดค่าคลาสนามธรรม
-
ป้องกัน $_items = array();
ฟังก์ชั่นสาธารณะ __construct() {
$นี่->โหลด();
-
โหลดฟังก์ชันป้องกันนามธรรม ();
ฟังก์ชั่นสาธารณะรับ ( $key ) {
กลับ $this->_items[ $key ];
-
}
คลาส DBConfiguration ขยายการกำหนดค่า
-
โหลดฟังก์ชันที่ได้รับการป้องกัน () {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
}
$c = DBConfiguration ใหม่();
echo( $c->get( 'imgpath' )."n" );
-
ขณะนี้ ความพยายามทั้งหมดในการสร้างอินสแตนซ์ออบเจ็กต์ประเภทการกำหนดค่าจะเกิดข้อผิดพลาด เนื่องจากระบบถือว่าคลาสนั้นเป็นนามธรรมและไม่สมบูรณ์
วิธีการแบบคงที่และสมาชิก
อีกคุณสมบัติใหม่ที่สำคัญใน PHP V5 คือการสนับสนุนสมาชิกแบบคงที่และวิธีการในชั้นเรียน โดยใช้ฟังก์ชันนี้ คุณสามารถใช้รูปแบบซิงเกิลตันยอดนิยมได้ รูปแบบนี้เหมาะสำหรับคลาสการกำหนดค่าเนื่องจากแอปพลิเคชันควรมีออบเจ็กต์การกำหนดค่าเดียวเท่านั้น
รายการ 10 แสดงเวอร์ชัน PHP V5 ของคลาสการกำหนดค่าเป็นซิงเกิลตัน
รายการ 10. static.php5
<?php
การกำหนดค่าคลาส
-
ส่วนตัว $_items = array();
ส่วนตัวคงที่ $_instance = null;
ฟังก์ชั่นสาธารณะแบบคงที่รับ () {
ถ้า ( ตนเอง::$_instance == null )
self::$_instance = การกำหนดค่าใหม่ ();
คืนตัวเอง::$_instance;
}
ฟังก์ชั่นส่วนตัว __construct() {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
ฟังก์ชั่นสาธารณะ __get( $key ) {
กลับ $this->_items[ $key ];
-
}
echo( การกำหนดค่า::get()->{ 'imgpath' }."n" );
-
คำหลักแบบคงที่มีประโยชน์หลายอย่าง พิจารณาใช้คีย์เวิร์ดนี้เมื่อคุณต้องการเข้าถึงข้อมูลส่วนกลางสำหรับออบเจ็กต์ทั้งหมดที่เป็นประเภทเดียว
Magic Method
คุณสมบัติใหม่ที่สำคัญอีกประการหนึ่งใน PHP V5 คือการรองรับเมธอด Magic ซึ่งอนุญาตให้อ็อบเจ็กต์เปลี่ยนอินเทอร์เฟซของอ็อบเจ็กต์ได้อย่างรวดเร็ว - ตัวอย่างเช่น การเพิ่มตัวแปรสมาชิกสำหรับแต่ละรายการการกำหนดค่าในอ็อบเจ็กต์การกำหนดค่า ไม่จำเป็นต้องใช้เมธอด get() เพียงแค่มองหารายการใดรายการหนึ่งแล้วถือว่าเป็นอาร์เรย์ ดังที่แสดงด้านล่าง
รายการ 11. magic.php5
<?php
การกำหนดค่าคลาส
-
ส่วนตัว $_items = array();
ฟังก์ชั่น __construct() {
$this->_items[ 'imgpath' ] = 'รูปภาพ';
-
ฟังก์ชั่น __get( $key ) {
กลับ $this->_items[ $key ];
-
}
$c = การกำหนดค่าใหม่();
echo( $c->{ 'imgpath' }."n" );
-
ในตัวอย่างนี้ ฉันได้สร้างเมธอด __get() ใหม่ที่ถูกเรียกเมื่อใดก็ตามที่ผู้ใช้ค้นหาตัวแปรสมาชิกบนออบเจ็กต์ รหัสภายในวิธีการนั้นจะใช้อาร์เรย์ของรายการเพื่อค้นหาค่าและส่งกลับค่านั้นราวกับว่ามีตัวแปรสมาชิกที่นั่นโดยเฉพาะสำหรับคำหลักนั้น สมมติว่าอ็อบเจ็กต์เป็นอาร์เรย์ ที่ส่วนท้ายของสคริปต์ คุณจะเห็นว่าการใช้อ็อบเจ็กต์ Configuration นั้นง่ายดายพอๆ กับการค้นหาค่าของ imgpath
เมื่อย้ายจาก PHP V4 ไปเป็น PHP V5 คุณต้องตระหนักถึงคุณสมบัติภาษาเหล่านี้ที่ไม่มีให้ใช้งานอย่างสมบูรณ์ใน PHP V4 และคุณต้องตรวจสอบคลาสอีกครั้งเพื่อดูว่าจะใช้งานได้อย่างไร
ข้อยกเว้น
ก็จบบทความนี้ด้วยการแนะนำกลไกข้อยกเว้นใหม่ใน PHP V5 ข้อยกเว้นถือเป็นวิธีคิดใหม่ในการจัดการกับข้อผิดพลาด ทุกโปรแกรมทำให้เกิดข้อผิดพลาดอย่างหลีกเลี่ยงไม่ได้ - ไม่พบไฟล์, หน่วยความจำไม่เพียงพอ ฯลฯ หากไม่ได้ใช้ข้อยกเว้น จะต้องส่งคืนรหัสข้อผิดพลาด โปรดดูโค้ด PHP V4 ด้านล่าง
รายการ 12. file.php4
<?php
ฟังก์ชั่น parseLine( $l )
-
-
ส่งคืนอาร์เรย์ ( 'ข้อผิดพลาด' => 0,
data => array() // ข้อมูลที่นี่
-
}
ฟังก์ชั่น readConfig( $path )
-
ถ้า ( $path == null ) กลับ -1;
$fh = fopen( $path, 'r' );
ถ้า ( $fh == null ) กลับ -2;
ในขณะที่ ( !feof( $fh ) ) {
$l = fgets( $fh );
$ec = parseLine( $l );
if ( $ec['error'] != 0 ) กลับ $ec['error'];
}
fclose( $fh );
กลับ 0;
}
$e = readConfig( 'myconfig.txt' );
ถ้า ( $อี != 0 )
echo( "มีข้อผิดพลาด (".$e.")n" );
-
รหัส I/O ของไฟล์มาตรฐานนี้จะอ่านไฟล์ ดึงข้อมูลบางส่วน และส่งคืนรหัสข้อผิดพลาดหากพบข้อผิดพลาดใดๆ ฉันมีสองคำถามเกี่ยวกับสคริปต์นี้ อันแรกคือรหัสข้อผิดพลาด รหัสข้อผิดพลาดเหล่านี้หมายความว่าอย่างไร เมื่อต้องการค้นหาว่ารหัสข้อผิดพลาดเหล่านี้หมายถึงอะไร คุณต้องสร้างระบบอื่นเพื่อแมปรหัสข้อผิดพลาดเหล่านี้เป็นสตริงที่มีความหมาย ปัญหาที่สองคือผลลัพธ์ที่ส่งคืนของ parseLine นั้นซับซ้อนมาก ฉันแค่ต้องการมันเพื่อส่งคืนข้อมูล แต่จริงๆ แล้วต้องส่งคืนรหัสข้อผิดพลาดและข้อมูล วิศวกรส่วนใหญ่ (รวมตัวผมเองด้วย) มักจะขี้เกียจและเพียงส่งคืนข้อมูลและเพิกเฉยต่อข้อผิดพลาด เนื่องจากข้อผิดพลาดนั้นยากต่อการจัดการ
รายการ 13 แสดงให้เห็นว่ารหัสมีความชัดเจนเพียงใดเมื่อใช้ข้อยกเว้น
รายการ 13. file.php5
<?php
ฟังก์ชั่น parseLine( $l )
-
// แยกวิเคราะห์และโยนและข้อยกเว้นเมื่อไม่ถูกต้อง
ส่งคืนอาร์เรย์(); // data
}
ฟังก์ชั่น readConfig( $path )
-
ถ้า ( $path == null )
โยนข้อยกเว้นใหม่ ( 'อาร์กิวเมนต์ไม่ถูกต้อง' )
;
ถ้า ( $fh == null )
โยนข้อยกเว้นใหม่ ( 'ไม่สามารถเปิดไฟล์ได้' );
while( !feof( $fh ) ) {
$l = fgets( $fh );
$ec = parseLine( $l );
}
fclose( $fh );
}
พยายาม {
readConfig( 'myconfig.txt' );
} จับ (ยกเว้น $e) {
เสียงสะท้อน($e);
-
-
ฉันไม่จำเป็นต้องกังวลเกี่ยวกับรหัสข้อผิดพลาดเนื่องจากข้อยกเว้นมีข้อความอธิบายข้อผิดพลาด ฉันไม่ต้องคิดถึงวิธีติดตามรหัสข้อผิดพลาดที่ส่งคืนจาก parseLine เพราะฟังก์ชันจะโยนข้อผิดพลาดหากเกิดขึ้น สแต็กขยายไปยังบล็อก try/catch ที่ใกล้ที่สุด ซึ่งอยู่ที่ด้านล่างของสคริปต์
ข้อยกเว้นจะปฏิวัติวิธีการเขียนโค้ดของคุณ แทนที่จะต้องจัดการเรื่องปวดหัวของรหัสข้อผิดพลาดและการแม็ป คุณสามารถมุ่งเน้นไปที่ข้อผิดพลาดที่คุณต้องการจัดการได้ โค้ดดังกล่าวอ่าน บำรุงรักษาได้ง่ายกว่า และฉันขอแนะนำให้คุณเพิ่มการจัดการข้อผิดพลาดด้วย เนื่องจากโดยปกติแล้วจะจ่ายเงินปันผล
คุณลักษณะเชิงวัตถุใหม่และการเพิ่มการจัดการข้อยกเว้นให้เหตุผล
ที่ชัดเจนในการย้ายโค้ดจาก PHP V4 ไปเป็น PHP V5 อย่างที่คุณเห็น กระบวนการอัพเกรดนั้นไม่ยาก ไวยากรณ์ที่ขยายไปถึง PHP V5 ให้ความรู้สึกเหมือนกับ PHP ใช่ ไวยากรณ์เหล่านี้มาจากภาษาอย่าง Ruby แต่ฉันคิดว่ามันทำงานร่วมกันได้ดีมาก และภาษาเหล่านี้ขยายขอบเขตของ PHP จากภาษาสคริปต์สำหรับไซต์ขนาดเล็กไปจนถึงภาษาที่สามารถใช้เพื่อเติมเต็มแอปพลิเคชันระดับองค์กรได้