ทำไมจึงไม่มีระบบอำนวยความสะดวกในการโอเวอร์โหลดคุณสมบัติคงที่ใน PHP?


13

Intro

PHP อนุญาตให้คุณโอเวอร์โหลดการเรียกใช้เมธอดและการเข้าถึงคุณสมบัติโดยการประกาศเมธอดมหัศจรรย์ในคลาส สิ่งนี้ทำให้รหัสเช่น:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

นอกเหนือจากการบรรทุกเกินพิกัดเช่นคุณสมบัติและวิธีการตั้งแต่ PHP 5.3.0 เรายังสามารถเกินวิธีการโทรออกโดยวิธีการเอาชนะมายากลstatic__callStatic

บางสิ่งหายไป

สิ่งที่ขาดหายไปจากฟังก์ชั่นที่มีอยู่อย่างชัดเจนคือความสามารถในการโอเวอร์โหลดคุณสมบัติสแตติกเช่น:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

ข้อ จำกัด นี้เป็นอย่างชัดเจนเอกสาร :

การโอเวอร์โหลดของคุณสมบัติใช้งานได้เฉพาะในบริบทของวัตถุ วิธีการเวทย์มนตร์เหล่านี้จะไม่ถูกกระตุ้นในบริบทคงที่ staticดังนั้นวิธีการเหล่านี้ไม่ควรได้รับการประกาศ ในฐานะของ PHP 5.3.0 staticคำเตือนจะออกถ้าวิธีใดวิธีหนึ่งมากไปมายากลมีการประกาศ

แต่ทำไม

คำถามของฉันคือ:

  1. มีเหตุผลทางเทคนิคหรือไม่ที่ฟังก์ชั่นนี้ไม่รองรับในปัจจุบัน? หรืออาจเป็นเหตุผลทางการเมือง (สั่น)
  2. เคยมีความพยายามยกเลิกการเพิ่มฟังก์ชันนี้ในอดีตหรือไม่?

สิ่งสำคัญที่สุดคือคำถามที่ไม่ได้เป็น "วิธีการที่ฉันสามารถมีคุณสมบัติคงที่แบบไดนามิกใน userland PHP?" ที่กล่าวว่าถ้าคุณรู้ว่าการใช้งานที่น่ารักโดยเฉพาะอย่างยิ่งขึ้นอยู่กับ__callStaticว่าคุณต้องการแบ่งปันแล้วโดยทั้งหมดทำเช่นนั้น

คำตอบ:


11

การอ้างอิงhttp://marc.info/?l=php-internals&m=121578194822276&w=2

มีการเพิ่มสมาชิกแบบคงที่มากเกินไปใน PHP 5.3 หรือไม่ ฉันสังเกตเห็นว่าวิธีการโหลดเกินพิกัดแบบคงที่คือ (__callStatic) ทั้งสองจะเสริมซึ่งกันและกันและมันก็เป็นธรรมชาติที่จะเพิ่มเหล่านี้เช่นกัน ฉันสังเกตเห็นว่าพวกเขาอยู่นอกเหนือ RFC "static-class" และรายงานข้อผิดพลาด แต่มันจะดีที่เห็นใน 5.3 ด้วยการเพิ่มและ LSB นี้คลาส PHP สามารถทำอะไรได้มากมาย! Ex:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

การติดตามผลการติดตามhttp://marc.info/?l=php-internals&m=121578318524848&w=2

หาก RFC สำหรับคลาสสแตติกจะได้รับการยอมรับตัวดักจับคุณสมบัติคงที่จะเป็นส่วนหนึ่งของเวอร์ชันหลัก PHP ถัดไป (อาจเป็น 5.4 หรือ 6) ดังนั้นมันจะไม่ทำให้มันกลายเป็น 5.3 แต่เราจะมีความหวังในอนาคต

ลิงก์ไปยังคลาสคงที่ RFC:

สถานะของ RFC คือ "ในผลงาน" แต่เนื่องจากเป็นปี 2008 คุณอาจต้องการสอบถามรายชื่อส่งจดหมายของ php.internals หรือใน # php.pecl ใน EFNet IRC เพื่อค้นหาว่าเกิดอะไรขึ้น


ขอบคุณ Gordon มีประโยชน์มากตามปกติ ;-) ในขณะที่ Static Classes RFC ดูเหมือนว่าจะเสนอการสนับสนุนสำหรับ__getStatic()และ__setStatic()ในคลาสคงที่มันจะยังคงมีประโยชน์ที่จะมีฟังก์ชั่นนี้สำหรับการเรียนได้ทันที คุณตระหนักถึงการเคลื่อนไหวในทิศทางนี้หรือไม่?
David Weinraub

@ DavidWeinraub ไม่ขอโทษ ฉันไม่สนใจสิ่งต่าง ๆ ที่เกี่ยวข้องกับวิธีการคงที่ ฉันแทบไม่เคยพบว่ามีประโยชน์ใด ๆ สำหรับพวกเขาและพวกเขานำไปสู่การมีเพศสัมพันธ์ที่ไม่ดีและการทดสอบที่เจ็บปวด
Gordon

เห็นด้วยอย่างยิ่ง! ;-) แต่เฟรมเวิร์กบางตัวที่ฉันใช้สถิตยศาสตร์สำหรับเลเยอร์โมเดล __getStatic()จะช่วยให้ฉันสามารถ DRY รหัสที่มีอยู่ของฉันจำนวนมากได้ ขอบคุณ!
David Weinraub
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.