บทคัดย่อ: ในบทความนี้ ผู้เขียนแสดงให้เราเห็นเทคโนโลยี OOP ขั้นสูงต่างๆ ใน PHP ผ่านตัวอย่างตามความเข้าใจของเขาเกี่ยวกับแนวคิด OOP ดังที่ผู้เขียนกล่าวว่า "จินตนาการเป็นข้อจำกัดเพียงอย่างเดียว"
หากคุณเข้าใจแนวคิด OOP พื้นฐาน ฉันคือคุณ จะมานำเสนอเทคนิคขั้นสูงเพิ่มเติม
การทำให้เป็นอนุกรม (การทำให้เป็นอนุกรม)
PHP ไม่รองรับวัตถุถาวร ใน OOP วัตถุถาวรคือวัตถุที่สามารถรักษาสถานะและการทำงานระหว่างการอ้างอิงในหลาย ๆ แอปพลิเคชัน ซึ่งหมายความว่ามีความสามารถในการบันทึกวัตถุลงในไฟล์หรือฐานข้อมูลและโหลด วัตถุในภายหลัง นี่คือกลไกที่เรียกว่าการทำให้เป็นอนุกรม PHP มีวิธีการทำให้เป็นอนุกรมที่สามารถเรียกใช้บนวัตถุได้ และวิธีการทำให้เป็นอนุกรมสามารถส่งคืนการแสดงสตริงของวัตถุได้ อย่างไรก็ตาม การทำให้เป็นอนุกรมจะบันทึกเฉพาะข้อมูลสมาชิกของออบเจ็กต์เท่านั้น ไม่ใช่วิธีการ
ใน PHP4 หากคุณซีเรียลไลซ์อ็อบเจ็กต์ลงในสตริง $s จากนั้นปล่อยอ็อบเจ็กต์ จากนั้นดีซีเรียลไลซ์อ็อบเจ็กต์ลงใน $obj คุณสามารถใช้เมธอดของอ็อบเจ็กต์ต่อไปได้! ฉันไม่แนะนำให้ทำเช่นนี้เพราะ (ก) ไม่มีการรับประกันในเอกสารประกอบว่าลักษณะการทำงานนี้จะยังคงใช้งานได้ในเวอร์ชันต่อๆ ไป (b) สิ่งนี้อาจทำให้เกิดความเข้าใจผิดเมื่อคุณบันทึกเวอร์ชันซีเรียลไลซ์ลงในดิสก์และออกจากสคริปต์ เมื่อคุณเรียกใช้สคริปต์นี้ในภายหลัง คุณไม่สามารถคาดหวังได้ว่าเมื่อคุณดีซีเรียลไลซ์วัตถุ วิธีการของวัตถุจะอยู่ที่นั่น เนื่องจากการแทนค่าสตริงไม่รวมวิธีการเลย
โดยรวมแล้ว การทำให้เป็นอนุกรมใน PHP มีประโยชน์มากสำหรับการบันทึกตัวแปรสมาชิกของออบเจ็กต์ (คุณยังสามารถทำให้อาร์เรย์และอาร์เรย์ที่เกี่ยวข้องเป็นอนุกรมลงในไฟล์ได้)
ตัวอย่าง:
<?php
$obj=new Classfoo();
$str=serialize($obj);
//บันทึก $str ลงดิสก์
//ไม่กี่เดือนต่อมา
//โหลด str จากดิสก์
$obj2=ยกเลิกการซีเรียลไลซ์($str)
คุณกู้คืนข้อมูลสมาชิก แต่ไม่ใช่วิธีการ (ตามเอกสารประกอบ) ซึ่งส่งผลให้เกิดวิธีเดียวในการเข้าถึงตัวแปรสมาชิก (คุณไม่มีทางอื่น!) โดยใช้บางอย่างเช่นการใช้ $obj2->x ดังนั้นอย่าลองทำที่บ้าน
มีวิธีแก้ปัญหานี้บ้าง ฉันจะทิ้งมันไว้เพราะมันแย่เกินไปสำหรับบทความที่กระชับนี้ ฉันยินดีเป็นอย่างยิ่งที่จะต้อนรับฟีเจอร์ที่ต่อเนื่องกันอย่างสมบูรณ์ใน PHP เวอร์ชันต่อๆ ไป
การใช้คลาสสำหรับการจัดเก็บข้อมูล ข้อดีอย่างหนึ่งของ PHP และ OOP คือคุณสามารถกำหนดคลาสให้ทำอะไรบางอย่างและเรียกคลาสที่เกี่ยวข้องได้ทุกเมื่อที่คุณต้องการใช้ สมมติว่าคุณมีแบบฟอร์ม HTML ที่อนุญาตให้ผู้ใช้เลือกผลิตภัณฑ์โดยเลือกหมายเลขรหัสผลิตภัณฑ์ มีข้อมูลผลิตภัณฑ์ในฐานข้อมูล และคุณต้องการแสดงสินค้า ราคา ฯลฯ คุณมีผลิตภัณฑ์หลายประเภท และการกระทำเดียวกันอาจหมายถึงสิ่งที่แตกต่างกันสำหรับผลิตภัณฑ์ที่แตกต่างกัน ตัวอย่างเช่น การแสดงเสียงอาจหมายถึงการเล่นเสียงนั้น แต่สำหรับผลิตภัณฑ์ประเภทอื่นๆ อาจหมายถึงการแสดงภาพที่จัดเก็บไว้ในฐานข้อมูล คุณสามารถใช้ OOP หรือ PHP เพื่อลดการเขียนโค้ดและปรับปรุงคุณภาพได้
กำหนดคลาสผลิตภัณฑ์ กำหนดวิธีการที่ควรมี (เช่น จอแสดงผล) จากนั้นกำหนดคลาสสำหรับผลิตภัณฑ์แต่ละประเภท ซึ่งได้มาจากคลาสผลิตภัณฑ์ (คลาส SoundItem คลาส ViewableItem ฯลฯ) ซึ่งครอบคลุมวิธีการของผลิตภัณฑ์ใน ชั้นเรียนเพื่อให้พวกเขาประพฤติตามที่คุณต้องการ
ตั้งชื่อคลาสตามฟิลด์ประเภทของผลิตภัณฑ์แต่ละรายการในฐานข้อมูล ตารางผลิตภัณฑ์ทั่วไปอาจมี (ฟิลด์ ID, ประเภท, ราคา, คำอธิบาย ฯลฯ)... จากนั้นในสคริปต์การประมวลผล คุณสามารถดึงข้อมูลจากฐานข้อมูลได้ รับค่าประเภทจาก จากนั้นสร้างอินสแตนซ์ของวัตถุชื่อ type:
<?php
$obj=new $type();
$obj->action();
นี่เป็นคุณสมบัติที่ดีมากของ PHP คุณสามารถเรียกวิธีแสดงหรือวิธีอื่นของ $obj ได้โดยไม่ต้องคำนึงถึงประเภทของวัตถุ เมื่อใช้เทคนิคนี้ คุณไม่จำเป็นต้องแก้ไขสคริปต์เพื่อเพิ่มอ็อบเจ็กต์ประเภทใหม่ เพียงแค่คลาสที่จะจัดการมัน
ฟังก์ชั่นนี้มีประสิทธิภาพมาก เพียงกำหนดวิธีการโดยไม่คำนึงถึงประเภทของวัตถุทั้งหมด นำไปใช้ในคลาสที่แตกต่างกันในวิธีการที่แตกต่างกัน จากนั้นใช้ในสคริปต์หลักสำหรับวัตถุใด ๆ ไม่ if...else ไม่ ต้องใช้โปรแกรมเมอร์สองคน มีความสุขเท่านั้น
ตอนนี้คุณยอมรับว่าการเขียนโปรแกรมเป็นเรื่องง่าย การบำรุงรักษาราคาถูก และการนำกลับมาใช้ใหม่ได้จริงหรือไม่
หากคุณจัดการกลุ่มโปรแกรมเมอร์ การมอบหมายงานก็เป็นเรื่องง่าย แต่ละคนอาจต้องรับผิดชอบประเภทของออบเจ็กต์และคลาสที่จัดการมัน
การทำให้เป็นสากลสามารถทำได้ด้วยเทคโนโลยีนี้ เพียงใช้คลาสที่เกี่ยวข้องตามฟิลด์ภาษาที่ผู้ใช้เลือก และอื่นๆ
การคัดลอกและการโคลน
เมื่อคุณสร้างอ็อบเจ็กต์ของ $obj คุณสามารถคัดลอกอ็อบเจ็กต์ด้วย $obj2=$obj ได้ อ็อบเจ็กต์ใหม่เป็นการคัดลอก (ไม่ใช่ข้อมูลอ้างอิง) ของ $obj ดังนั้นจึงมีสถานะของ $obj ในขณะนั้น . บางครั้งคุณไม่ต้องการทำเช่นนี้ คุณเพียงต้องการสร้างวัตถุใหม่เช่นคลาส obj คุณสามารถเรียก Constructor ของคลาสได้โดยใช้คำสั่งใหม่ สิ่งนี้สามารถทำได้ใน PHP ผ่านการซีเรียลไลซ์และคลาสพื้นฐาน แต่คลาสอื่นทั้งหมดจะต้องได้มาจากคลาสพื้นฐาน
การเข้าสู่โซนอันตราย
เมื่อคุณซีเรียลไลซ์วัตถุ คุณจะได้รับสตริงในรูปแบบใดรูปแบบหนึ่ง ซึ่งคุณสามารถซักถามได้หากคุณสนใจ โดยที่ในสตริงมีชื่อของคลาส (เยี่ยมมาก!) และคุณสามารถใส่มันได้ ถูกนำออกมาเช่น:
<?php
$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]) ;
สมมติว่าคุณสร้างคลาส "จักรวาล" และบังคับให้คลาสทั้งหมดขยายจากจักรวาล คุณสามารถกำหนดวิธีการโคลนในจักรวาลได้ดังนี้:
<?php
function clone() {
$herring=serialize($ this)
; explode(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
/ /จากนั้น
$obj=new บางสิ่งบางอย่าง();
//ขยายจากจักรวาล
$other=$obj->clone();
สิ่งที่คุณได้รับคืออ็อบเจ็กต์คลาส Something ใหม่ ซึ่งเหมือนกับอ็อบเจ็กต์ที่สร้างขึ้นโดยใช้เมธอดใหม่และเรียกตัวสร้าง ฉันไม่รู้ว่าสิ่งนี้จะได้ผลสำหรับคุณหรือไม่ แต่เป็นหลักการที่ดีที่คลาสจักรวาลจะรู้ชื่อของคลาสที่ได้รับ จินตนาการเป็นเพียงขีดจำกัดเท่านั้น
คำสั่งนี้เขียนเวลาปัจจุบัน