1. บทนำ
การใช้ประเภทวัตถุบังคับใน PHP บางครั้งอาจมีความสำคัญมาก หากหายไป เนื่องจากขาดความรู้ - ขึ้นอยู่กับสมมติฐานการเขียนโปรแกรมที่ไม่ถูกต้อง หรือเพียงความเกียจคร้าน - คุณจะเห็นผลลัพธ์ในเว็บแอปพลิเคชันเฉพาะของคุณที่คุณไม่คาดคิด โดยเฉพาะอย่างยิ่งเมื่อเขียนโปรแกรมใน PHP 4 มันง่ายมากที่จะใช้ฟังก์ชัน "is_a()" (แม้ว่าจะมีวิธีอื่น) เพื่อตรวจสอบประเภทของอ็อบเจ็กต์ที่คุณใช้งานอยู่ แน่นอนว่าการบังคับประเภทวัตถุยังสามารถใช้เพื่อกรองวัตถุอินพุตที่ต้องส่งเป็นพารามิเตอร์ไปยังคลาส PHP อื่นในแอปพลิเคชันเดียวกัน
อย่างไรก็ตาม PHP 4 ไม่ได้เปิดเผยจุดอ่อนบางประการเกี่ยวกับโมเดลออบเจ็กต์ของมัน - บางครั้งอาจจำเป็นต้องเขียนโค้ดเพิ่มเติมเพื่อใช้งานคุณสมบัติบางอย่างที่พบในภาษาเชิงวัตถุที่เป็นผู้ใหญ่ ข้อเท็จจริงนี้เป็นที่รู้จักของชุมชน PHP มาเป็นเวลานาน อย่างไรก็ตาม ด้วยการเปิดตัว PHP 5 คุณลักษณะอันล้ำค่าเหล่านี้จำนวนมากได้ถูกเพิ่มเข้ามาเป็นส่วนหนึ่งของโมเดลออบเจ็กต์ที่ได้รับการปรับปรุง พวกเขาจะช่วยดำเนินการพัฒนาโค้ดตามวัตถุอย่างใกล้ชิดมากขึ้น - ทำให้คุณสามารถใช้คุณลักษณะเฉพาะของวัตถุได้
ในกรณีข้างต้น ควรใช้ความระมัดระวังเป็นพิเศษเมื่อพูดถึงการบังคับขู่เข็ญประเภทวัตถุ ในความเป็นจริง PHP 5 ช่วยให้นักพัฒนามีวิธีตรวจสอบประเภทอ็อบเจ็กต์อย่างน้อยสองวิธีระหว่างการทำงานของเว็บแอปพลิเคชัน - ทั้งสองคือตัวดำเนินการ "instanceof" และคุณลักษณะ "คำใบ้ประเภท" ตอนนี้หันมาที่หัวข้อหลักของบทความนี้ ฉันจะแนะนำการใช้ตัวดำเนินการ "instanceof" ใน PHP 5 ในไม่ช้าคุณจะพบว่าสะดวกมากในการพิจารณาว่าวัตถุที่คุณทำงานด้วยเป็นประเภทใดประเภทหนึ่งหรือไม่
บทความนี้จะช่วยให้คุณเข้าใจวิธีการใช้ประเภทออบเจ็กต์บังคับใน PHP 5 ผ่านตัวอย่างเชิงวัตถุบางส่วน
2. สิ่งที่คุณไม่ควรทำ
เพื่อแสดงวิธีการบังคับใช้ประเภทอ็อบเจ็กต์ใน PHP 5 ฉันจะใช้คลาสวิดเจ็ต (X)HTML และคลาสตัวสร้างเพจอย่างง่าย พร้อมการแก้ไขอย่างง่าย ๆ เพื่อให้เหมาะกับสภาพแวดล้อมการพัฒนา PHP 5
ตัวอย่างแรกของฉันแสดงรายการคลาสวิดเจ็ต (X)HTML บางส่วนที่ได้มาจากคลาสฐานนามธรรม "HTMLLElement" ซึ่งจะข้ามการตรวจสอบประเภทของออบเจ็กต์อินพุต โปรดดูที่คลาสต่อไปนี้ก่อน:
//กำหนดคลาสนามธรรม 'HTMLElement'
HTMLElement ระดับนามธรรม{
ป้องกัน $attributes;
ฟังก์ชั่นที่ได้รับการป้องกัน __construct($attributes){
ถ้า(!is_array($แอตทริบิวต์)){
โยนข้อยกเว้นใหม่ ('ประเภทแอตทริบิวต์ไม่ถูกต้อง');
-
$this->attributes=$attributes;
-
// บทคัดย่อวิธี 'getHTML()' ฟังก์ชันป้องกันนามธรรม getHTML();
-
//กำหนดคลาสเฉพาะ 'Div'-ขยาย HTMLElement
div คลาสขยาย HTMLElement{
ส่วนตัว $output='<div ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</div>';
ส่งคืน $this->output;
-
-
//กำหนดคลาสคอนกรีต 'Header1' - ขยาย HTMLElement
คลาส Header1 ขยาย HTMLElement {
ส่วนตัว $output='<h1 ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</h1>';
ส่งคืน $this->output;
-
-
//กำหนดคลาสที่เป็นรูปธรรม 'ย่อหน้า' - ขยาย HTMLElement
ย่อหน้าคลาสขยาย HTMLElement{
ส่วนตัว $output='<p ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=$this->data.'</p>';
ส่งคืน $this->output;
-
-
//กำหนดคลาสที่เป็นรูปธรรม 'UnorderedList' - ขยาย HTMLElement
คลาส UnorderedList ขยาย HTMLElement {
ส่วนตัว $output='<ul ';
ส่วนตัว $items=array();
ฟังก์ชั่นสาธารณะ __construct($attributes=array(), $items=array()){
parent::__construct($attributes);
ถ้า(!is_array($รายการ)){
โยนข้อยกเว้นใหม่ ('พารามิเตอร์ไม่ถูกต้องสำหรับรายการ');
-
$นี่->รายการ=$รายการ;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
foreach($this->items เป็น $item){
$this->output.='<li><'.$item.'</li><';
-
$this->output.='</ul>';
ส่งคืน $this->output;
-
}
อย่างที่คุณเห็น คลาสวิดเจ็ต (X)HTML ด้านบนมีประโยชน์มากสำหรับการสร้างองค์ประกอบเฉพาะในเว็บ แต่ฉันตั้งใจเขียนโค้ดสำหรับแต่ละคลาส เพื่อไม่ให้ตรวจสอบประสิทธิภาพของพารามิเตอร์อินพุตได้ ดังที่คุณอาจจินตนาการได้ พารามิเตอร์อินพุตจะถูกส่งโดยตรงไปยังตัวสร้างคลาสและกำหนดเป็นคุณสมบัติ คำถามเกิดขึ้น: มีอะไรผิดปกติในการทำเช่นนี้หรือไม่? ใช่มีอยู่ ตอนนี้ ฉันจะกำหนดคลาสตัวสร้างเพจที่ง่ายที่สุดของฉันและป้อนด้วยวิดเจ็ตเช่นนี้เพื่อให้คุณเห็นว่าอินพุตของคลาสนี้ผสมกับอ็อบเจ็กต์ที่ไม่ถูกต้องอย่างไร นี่คือลายเซ็นของคลาสตัวสร้างเพจ:
class PageGenerator{
ส่วนตัว $output='';
ชื่อ $ ส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($title='หน้าเริ่มต้น'){
$this->title=$title;
-
ฟังก์ชั่นสาธารณะ doHeader(){
$this->output='<html><head><title><'.$this-
>ชื่อ.'</title><</head><body>';
-
ฟังก์ชั่นสาธารณะ addHTMLElement($htmlElement){
$this->output.=$htmlElement->getHTML();
-
ฟังก์ชั่นสาธารณะ doFooter(){
$this->output.='</body></html>';
-
ฟังก์ชั่นสาธารณะ fetchHTML(){
ส่งคืน $this->output;
-
}
ตอนนี้ เราเริ่มสร้างอินสแตนซ์ของอ็อบเจ็กต์วิดเจ็ต (X)HTML บางส่วนและส่งผ่านไปยังคลาสตัวสร้างที่เกี่ยวข้อง ดังที่แสดงในตัวอย่างต่อไปนี้:
ลอง{
//สร้างองค์ประกอบ HTML บางส่วน $h1=new Header1(array('name'=>'header1', 'class'=>'headerclass'), 'Content for H1
องค์ประกอบอยู่ที่นี่ ');
$div=new Div(array('name'=>'div1','class'=>'divclass'),'เนื้อหาสำหรับองค์ประกอบ Div
ไปที่นี่');
$par=new Paragraph(array('name'=>'par1','class'=>'parclass'),'เนื้อหาสำหรับย่อหน้า
องค์ประกอบอยู่ที่นี่ ');
$ul=new UnorderedList(array ('ชื่อ'=>'list1', 'class'=>'listclass'), อาร์เรย์
('item1'=>'value1', 'item2'=>'value2', 'item3'=>'value3'));
//สร้างตัวอย่างคลาสตัวสร้างเพจ $pageGen=new Page Generator();
$pageGen->doHeader();
//เพิ่มวัตถุ 'HTMLElement' $pageGen->addHTMLElement($h1);
$pageGen->addHTMLElement($div);
$pageGen->addHTMLElement($ตราไว้หุ้นละ);
$pageGen->addHTMLElement($ul);
$pageGen->doFooter();
//แสดงหน้าเว็บ echo $pageGen->fetchHTML();
-
catch(ยกเว้น $e){
เสียงสะท้อน $e->getMessage();
ออก();
}
หลังจากรันโค้ด PHP ข้างต้น ผลลัพธ์ที่คุณได้รับคือหน้าเว็บธรรมดา ซึ่งมีออบเจ็กต์ (X)HTML บางส่วนที่สร้างขึ้นก่อนหน้านี้ ในกรณีนี้ เป็นเรื่องง่ายที่จะเข้าใจว่าจะเกิดอะไรขึ้นหากคลาสตัวสร้างเพจได้รับออบเจ็กต์ที่ไม่ถูกต้องและเรียกใช้เมธอด "addHTML()" ด้วยเหตุผลบางประการ ที่นี่ ฉันได้ปรับปรุงเงื่อนไขข้อขัดแย้ง - โดยใช้ออบเจ็กต์วิดเจ็ต (X)HTML ที่ไม่มีอยู่จริง โปรดดูโค้ดต่อไปนี้อีกครั้ง:
ลอง {
//สร้างองค์ประกอบ HTML บางส่วน $h1=new Header1(array('name'=>'header1', 'class'=>'headerclass'), 'Content for H1
องค์ประกอบอยู่ที่นี่ ');
$div=new Div(array('name'=>'div1','class'=>'divclass'),'เนื้อหาสำหรับองค์ประกอบ Div
ไปที่นี่');
$par=new Paragraph(array('name'=>'par1','class'=>'parclass'),'เนื้อหาสำหรับย่อหน้า
องค์ประกอบอยู่ที่นี่ ');
$ul=new UnorderedList(array ('ชื่อ'=>'list1', 'class'=>'listclass'), อาร์เรย์
('item1'=>'value1', 'item2'=>'value2', 'item3'=>'value3'));
//สร้างตัวอย่างคลาสตัวสร้างเพจ $pageGen=new Page Generator();
$pageGen->doHeader();
//เพิ่มวัตถุ 'HTMLElement' $pageGen->addHTMLElement($fakeobj) // ส่งผ่านวัตถุที่ไม่มีอยู่จริงไปยังวิธีนี้ $pageGen->addHTMLElement($div);
$pageGen->addHTMLElement($ตราไว้หุ้นละ);
$pageGen->addHTMLElement($ul);
$pageGen->doFooter();
// แสดงหน้า echo $pageGen->fetchHTML();
-
catch(ยกเว้น $e){
เสียงสะท้อน $e->getMessage();
ออก();
}
ในกรณีนี้ ดังแสดงในบรรทัดต่อไปนี้:
$pageGen->addHTMLElement($fakeobj)//ส่งอ็อบเจ็กต์ที่ไม่มีอยู่จริงไปยังเมธอดนี้
อ็อบเจ็กต์วิดเจ็ต (X)HTML ที่ไม่มีอยู่จริงถูกส่งไปยังคลาสตัวสร้างเพจ ซึ่ง จะส่งผลให้เกิดข้อผิดพลาดร้ายแรง:
ข้อผิดพลาดร้ายแรง: การเรียกใช้ฟังก์ชันสมาชิกบนวัตถุที่ไม่ใช่
แล้ว
path/to/file
ล่ะ?นี่เป็นการลงโทษโดยตรงสำหรับการไม่ตรวจสอบประเภทของอ็อบเจ็กต์ที่ส่งไปยังคลาสตัวสร้าง! ดังนั้นอย่าลืมคำนึงถึงสิ่งนี้เมื่อเขียนสคริปต์ของคุณ โชคดีที่มีวิธีแก้ไขปัญหาเหล่านี้ง่ายๆ และนี่คือจุดที่พลังของตัวดำเนินการ "instanceof" เข้ามามีบทบาท หากคุณต้องการดูว่าโอเปอเรเตอร์นี้ใช้งานอย่างไร โปรดอ่านต่อ
3. ใช้ตัวดำเนินการ "instanceof"
อย่างที่คุณเห็น การใช้ตัวดำเนินการ "instanceof" นั้นง่ายมาก โดยจะใช้พารามิเตอร์สองตัวเพื่อทำให้ฟังก์ชันสมบูรณ์ พารามิเตอร์ตัวแรกคือออบเจ็กต์ที่คุณต้องการตรวจสอบ และพารามิเตอร์ตัวที่สองคือชื่อคลาส (จริงๆ แล้วเป็นชื่ออินเทอร์เฟซ) ที่ใช้ในการพิจารณาว่าออบเจ็กต์นั้นเป็นอินสแตนซ์ของคลาสที่เกี่ยวข้องหรือไม่ แน่นอนว่าฉันใช้คำศัพท์ข้างต้นอย่างตั้งใจเพื่อให้คุณเห็นว่าโอเปอเรเตอร์นี้ใช้งานง่ายเพียงใด ไวยากรณ์พื้นฐานเป็นดังนี้:
if (อินสแตนซ์อ็อบเจ็กต์ของชื่อคลาส){
//ทำสิ่งที่มีประโยชน์
}
เมื่อคุณเข้าใจวิธีการใช้โอเปอเรเตอร์นี้ใน PHP 5 แล้ว เรามากำหนดคลาสตัวสร้างเว็บเพจที่เกี่ยวข้องกันเพื่อตรวจสอบประเภทของออบเจ็กต์ที่ส่งไปยังเมธอด "addHTMLElement()" กัน นี่คือลายเซ็นใหม่ของคลาสนี้ ซึ่งฉันได้กล่าวไว้ก่อนหน้านี้ใช้ตัวดำเนินการ "instanceof":
class PageGenerator{
ส่วนตัว $output='';
ชื่อ $ ส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($title='หน้าเริ่มต้น'){
$this->title=$title;
-
ฟังก์ชั่นสาธารณะ doHeader(){
$this->output='<html><<head><title><'.$this->title.'</title>< </head> <body>';
-
ฟังก์ชั่นสาธารณะ addHTMLElement($htmlElement){
if(!$htmlElement อินสแตนซ์ของ HTMLElement){
โยนข้อยกเว้นใหม่ ('องค์ประกอบ (X) HTML ไม่ถูกต้อง');
-
$this->output.=$htmlElement->getHTML();
-
ฟังก์ชั่นสาธารณะ doFooter(){
$this->output.='</body></html>';
-
ฟังก์ชั่นสาธารณะ fetchHTML(){
ส่งคืน $this->output;
-
}
หมายเหตุ ในคลาสข้างต้น วิธีรวมตัวดำเนินการ "instanceof" ในเมธอด "addHTMLElement()" เพื่อให้แน่ใจว่าออบเจ็กต์ที่ส่งผ่านทั้งหมดเป็นอินสแตนซ์ของคลาส "HTMLElement" ที่กำหนดไว้ก่อนหน้านี้ ขณะนี้ คุณสามารถสร้างเว็บเพจที่คุณเห็นก่อนหน้านี้ขึ้นมาใหม่ได้ ในกรณีนี้ ตรวจสอบให้แน่ใจว่าออบเจ็กต์อินพุตทั้งหมดที่ส่งไปยังคลาสตัวสร้างเว็บเพจนั้นเป็นออบเจ็กต์วิดเจ็ตจริง (X)HTML นี่คือตัวอย่างที่เกี่ยวข้อง:
try{
//สร้างองค์ประกอบ HTML บางส่วน $h1=new Header1(array('name'=>'header1', 'class'=>'headerclass'), 'เนื้อหาสำหรับองค์ประกอบ H1 อยู่ที่นี่');
$div=new Div(array('name'=><'div1', 'class'=>'divclass'), 'เนื้อหาสำหรับองค์ประกอบ Div อยู่ที่นี่');
$par=new Paragraph(array('name'=>'par1','class'=>'parclass'),'เนื้อหาสำหรับองค์ประกอบย่อหน้าอยู่ที่นี่');
$teststr='นี่ไม่ใช่องค์ประกอบ HTML';
//สร้างตัวอย่างคลาสตัวสร้างเพจ $pageGen=new Page Generator();
$pageGen->doHeader();
//Add 'HTMLElement' object $pageGen->addHTMLElement($teststr) //ส่งสตริงธรรมดาไปที่เมธอดนี้ $pageGen->addHTMLElement($h1);
$pageGen->addHTMLElement($div);
$pageGen->addHTMLElement($ตราไว้หุ้นละ);
$pageGen->doFooter();
//แสดงหน้าเว็บ echo $pageGen->fetchHTML();
-
catch(ยกเว้น $e){
เสียงสะท้อน $e->getMessage();
ออก();
}
ดังที่คุณเห็นในตัวอย่างข้างต้น ฉันกำลังส่งสตริงทดสอบธรรมดา (ไม่ใช่ออบเจ็กต์ "HTMLElement") ไปยังคลาสตัวสร้างเพจ ซึ่งจะทำให้เกิดข้อยกเว้น - ตรวจพบโดยบล็อก "catch" เฉพาะดังที่แสดงด้านล่าง:
องค์ประกอบ (X)HTML ไม่ถูกต้อง
ในขณะนี้ เพื่อพิจารณาความถูกต้องของออบเจ็กต์อินพุต ฉันใช้ตัวดำเนินการ "instanceof" เพื่อให้หน้าเว็บข้างต้นเป็นได้ ฉันหวังว่าคุณจะเข้าใจถึงความสำคัญของการกรองอินพุตเพื่อ วิธีการของชั้นเรียนของคุณเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่เกี่ยวข้องโดยใช้ตัวดำเนินการป้อนข้อมูลนี้
หลังจากแสดงการใช้งานที่ถูกต้องของตัวดำเนินการ "instanceof" ภายในคลาสตัวสร้างหน้าเว็บ ยังมีอะไรให้ทำอีกมากมายคล้ายกับสิ่งที่ฉันเขียนสำหรับ PHP 4 ในบทความก่อนหน้านี้ (X) สำหรับคลาสวิดเจ็ต HTML ฉันต้องการรวมโอเปอเรเตอร์นี้เป็นส่วนหนึ่งของวิธีการ "getHTML()" ดังนั้นจึงอนุญาตให้สร้างหน้าเว็บที่สร้างองค์ประกอบ (X)HTML ที่ซ้อนกัน
4. ขยายการใช้ตัวดำเนินการ "instanceof": วิดเจ็ต Nested (X)HTML
นั้นดี คุณได้เห็นแล้วว่าตัวดำเนินการ "instanceof" ทำงานได้ดีในการตรวจสอบประเภทบนออบเจ็กต์อินพุตที่ถูกแทรกลงในคลาสตัวสร้างเพจโดยตรง ตอนนี้ ฉันจะไปอีกขั้นหนึ่งและเพิ่มรูทีนการตรวจสอบให้กับ Constructor และเมธอด "getHTML()" ของคลาสวิดเจ็ต (X)HTML เพื่อให้สามารถยอมรับวิดเจ็ตอื่น ๆ เป็นพารามิเตอร์อินพุตได้ โปรดตรวจสอบการปรับปรุงด้านล่าง
div คลาสขยาย HTMLElement {
ส่วนตัว $output='<div ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
if(!$data อินสแตนซ์ของ HTMLElement&&!is_string($data)){
โยนข้อยกเว้นใหม่ ('ประเภทพารามิเตอร์ไม่ถูกต้อง');
-
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->อินสแตนซ์ข้อมูลของ HTMLElement)?
$นี่->ข้อมูล->getHTML():$นี่->ข้อมูล;
$this->output.='</div>';
ส่งคืน $this->output;
-
-
คลาส Header1 ขยาย HTMLElement {
ส่วนตัว $output='<h1 ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
if(!$data อินสแตนซ์ของ HTMLElement&&!is_string($data)){
โยนข้อยกเว้นใหม่ ('ประเภทพารามิเตอร์ไม่ถูกต้อง');
-
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->อินสแตนซ์ข้อมูลของ HTMLElement)?
$นี่->ข้อมูล->getHTML():$นี่->ข้อมูล;
$นี่->output.='</h1>';
ส่งคืน $this->output;
-
-
ย่อหน้าคลาสขยาย HTMLElement{
ส่วนตัว $output='<p ';
$ ข้อมูลส่วนตัว;
ฟังก์ชั่นสาธารณะ __construct($attributes=array(),$data){
if(!$data อินสแตนซ์ของ HTMLElement&&!is_string($data)){
โยนข้อยกเว้นใหม่ ('ประเภทพารามิเตอร์ไม่ถูกต้อง');
-
parent::__construct($attributes);
$นี่->ข้อมูล=$ข้อมูล;
-
//การใช้งานเฉพาะของฟังก์ชัน 'getHTML()' ฟังก์ชันสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->อินสแตนซ์ข้อมูลของ HTMLElement)?
$นี่->ข้อมูล->getHTML():$นี่->ข้อมูล;
$นี่->output.='</p>';
ส่งคืน $this->output;
-
-
คลาส UnorderedList ขยาย HTMLElement {
ส่วนตัว $output='<ul ';
ส่วนตัว $items=array();
ฟังก์ชั่นสาธารณะ __construct($attributes=array(), $items=array()){
parent::__construct($attributes);
ถ้า(!is_array($รายการ)){
โยนข้อยกเว้นใหม่ ('พารามิเตอร์ไม่ถูกต้องสำหรับรายการ');
-
$นี่->รายการ=$รายการ;
-
//การใช้งานเฉพาะของเมธอด 'getHTML()'
ฟังก์ชั่นสาธารณะ getHTML(){
foreach($this->แอตทริบิวต์เป็น $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
-
$this->output=substr_replace($this->output,'>',-1);
foreach($this->items เป็น $item){
$this->output.=($item instanceof
HTMLElement)?'<li><'.$item->getHTML().'</li><':'<li><'.$item.'</li><';
-
$this->output.='</ul>';
ส่งคืน $this->output;
-
}
ดังที่แสดงในคลาสข้างต้น เพื่ออนุญาตให้องค์ประกอบ (X)HTML ที่ซ้อนกันสามารถนำไปใช้ได้เมื่อสร้างหน้าเว็บที่เกี่ยวข้อง ฉันจึงปรับโครงสร้างตัวสร้างและเมธอด "getHTML()" ตามลำดับ โปรดทราบว่าฉันได้รวมบล็อกแบบมีเงื่อนไขต่อไปนี้ในตัวสร้างของแต่ละคลาส:
if(!$data instanceof HTMLElement&&!is_string($data)){
โยนข้อยกเว้นใหม่ ('ประเภทพารามิเตอร์ไม่ถูกต้อง');
}
ณ จุดนี้ สิ่งที่ฉันทำจริง ๆ คือตรวจสอบให้แน่ใจว่าอนุญาตให้เฉพาะข้อมูลสตริงและออบเจ็กต์ประเภท "HTMLElement" เป็นพารามิเตอร์อินพุตสำหรับแต่ละคลาส มิฉะนั้น จะมีข้อยกเว้นเกิดขึ้นตามวิธีการที่เกี่ยวข้อง และอาจทำให้แอปพลิเคชันหยุดการดำเนินการ นี่คือกระบวนการตรวจสอบข้อมูลอินพุต ตอนนี้ เรามาดูลายเซ็นใหม่ของเมธอด "getHTML()" ซึ่งใช้ตัวดำเนินการ "instanceof" ด้วย:
$this->output.=($this->data instanceof HTMLElement)?$this->data-
>getHTML():$this->data;
ดังที่คุณเห็น ในกรณีนี้ โอเปอเรเตอร์นี้มีประโยชน์มากสำหรับการใช้ประโยชน์จากคุณสมบัติ polymorphic ของคลาสวิดเจ็ต (X)HTML หากแอตทริบิวต์ $data เป็นวิดเจ็ตด้วย ดังนั้นเมธอด "getHTML()" จะถูกเรียกใช้อย่างถูกต้อง ซึ่งจะทำให้องค์ประกอบเว็บที่ซ้อนกันแสดงขึ้น ในทางกลับกัน หากเป็นเพียงสตริง ก็จะถูกเพิ่มโดยตรงไปยังเอาต์พุตทั้งหมดของคลาสปัจจุบัน
ณ จุดนี้ คุณอาจเข้าใจการใช้งานตัวดำเนินการ "instanceof" ใน PHP 5 แล้ว เพื่อให้แน่ใจว่าวัตถุบางอย่างอยู่ในประเภทเฉพาะ ดังที่คุณเห็นในบทความนี้ การบังคับประเภทอ็อบเจ็กต์ใน PHP 5 นั้นเป็นงานที่ค่อนข้างตรงไปตรงมา ในตอนนี้ คุณควรพัฒนาตัวอย่างการใช้วิธีนี้เพื่อกรองอ็อบเจ็กต์ในแอปพลิเคชัน PHP ของคุณเพื่อให้เข้าใจลึกซึ้งยิ่งขึ้น
5. สรุป
ในบทความนี้ คุณได้เรียนรู้วิธีใช้ตัวดำเนินการ "instanceof" ใน PHP 5 เพื่อตรวจสอบประเภทของออบเจ็กต์อินพุตของคุณ อย่างไรก็ตาม วิธีที่ฉันแสดงให้คุณเห็นไม่ใช่วิธีเดียว ในบทความต่อๆ ไป ผมจะอธิบายให้คุณทราบถึงวิธีการใช้ฟีเจอร์ "การบอกใบ้ประเภท" ที่ดีใน PHP 5 ซึ่งเป็นอีกวิธีหนึ่งในการบังคับใช้การพิมพ์ออบเจ็กต์
ผู้แต่ง: Zhu Xianzhong Compiler ที่มา: Tianji Development