ค้นหาไฟล์ PHP (ในขณะทำงาน) ที่มีการกำหนดคลาส


111

มีการไตร่ตรอง / วิปัสสนา / เวทมนตร์ใน PHP ที่จะช่วยให้คุณค้นหาไฟล์ PHP ที่กำหนดคลาส (หรือฟังก์ชัน) ไว้หรือไม่?

กล่าวอีกนัยหนึ่งฉันมีชื่อของคลาส PHP หรืออ็อบเจ็กต์ที่สร้างอินสแตนซ์ ฉันต้องการส่งสิ่งนี้ไปยังบางสิ่ง (ฟังก์ชันคลาสการสะท้อนแสง ฯลฯ ) ที่จะส่งคืนเส้นทางระบบไฟล์ที่คลาสถูกกำหนดไว้

/path/to/class/definition.php

ฉันรู้ว่าฉันสามารถใช้ ( get_included_files())เพื่อรับรายการไฟล์ทั้งหมดที่รวมไว้จนถึงตอนนี้แล้วแยกวิเคราะห์ทั้งหมดด้วยตนเอง แต่นั่นเป็นการเข้าถึงระบบไฟล์จำนวนมากสำหรับการพยายามครั้งเดียว

ฉันยังตระหนักว่าฉันสามารถเขียนโค้ดเพิ่มเติมในกลไก __autoload ของเราที่เก็บข้อมูลนี้ไว้ที่ไหนสักแห่ง อย่างไรก็ตามการแก้ไข __autoload ที่มีอยู่นั้นไม่ได้มีข้อ จำกัด ในสถานการณ์ที่ฉันคิดไว้

การได้ยินเกี่ยวกับส่วนขยายที่สามารถทำสิ่งนี้ได้น่าสนใจ แต่สุดท้ายแล้วฉันก็ชอบสิ่งที่สามารถทำงานบนการติดตั้ง "สต็อค" ได้


2
Magento พาฉันมาที่นี่: -]
Alan

@ ลันดีที่จะเห็นการสะกดชื่อทรัพย์สินที่นั่น
Alan Storm

คำตอบ:


225

ลอง ReflectionClass

ตัวอย่าง:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

สิ่งนี้จะส่งคืนfalseเมื่อไม่พบชื่อไฟล์เช่นในคลาสเนทีฟ


10

สำหรับ ReflectionClass ในไฟล์เนมสเปซให้เพิ่มคำนำหน้า "\" เพื่อทำให้เป็นโกลบอลดังต่อไปนี้:

$ reflector = new \ ReflectionClass ('FOO');

มิฉะนั้นจะสร้างข้อผิดพลาดที่กล่าวว่า ReflectionClass ในเนมสเปซไม่ได้กำหนดไว้ ฉันไม่มีสิทธิ์แสดงความคิดเห็นสำหรับคำตอบข้างต้นดังนั้นฉันจึงเขียนสิ่งนี้เป็นคำตอบเสริม


0

หากคุณมีโฟลเดอร์รวมคุณสามารถเรียกใช้คำสั่งเชลล์สคริปต์เพื่อ "grep" สำหรับ "class $ className" โดยทำ: $filename = ``grep -r "class $className" $includesFolder/*\และมันจะส่งคืนไฟล์ที่อยู่ในนั้นนอกเหนือจากนั้นฉันไม่คิดว่าจะมีเวทมนตร์ใด ๆ ฟังก์ชันสำหรับ PHP ทำเพื่อคุณ


3
ความอยากรู้อยากเห็นที่ตรงไปตรงมาและไม่ใช่รูตูดที่นี่ อะไรทำให้คุณคิดว่าคำตอบนี้ดีไปกว่าความคิดที่ฉันเคยพิจารณาและปฏิเสธไปแล้ว? "ฉันตระหนักดีว่าฉันสามารถใช้ (get_included_files ()) เพื่อรับรายการไฟล์ทั้งหมดที่รวมไว้จนถึงตอนนี้จากนั้นแยกวิเคราะห์ทั้งหมดด้วยตนเอง แต่นั่นเป็นการเข้าถึงระบบไฟล์จำนวนมากสำหรับการพยายามครั้งเดียว"
Alan Storm

เพราะมันเป็นบรรทัดเดียวซึ่งต่างจากที่ต้องใช้หลายบรรทัดในการเขียน parser ใน PHP และฟังก์ชัน grep นั้นถูกคอมไพล์ C ฉันคิดว่าและน่าจะเร็วกว่าที่เขียนไว้มาก
Seaux

อ่าเข้าใจแล้ว ข้อกังวลที่แท้จริงของฉันคือการเข้าถึงดิสก์ซ้ำ ๆ ในแต่ละไฟล์ซ้ำแล้วซ้ำเล่าเพื่อทำสิ่งนี้ (เป็นสิ่งที่จะเกิดขึ้นมากมายในเครื่องมือที่ฉันกำลังสร้าง) ไม่ใช่จำนวนรหัสที่ฉันจะพยายามทำให้ชัดเจนขึ้นต่อไป เวลา. (FYI: คุณควรมองเข้าไปใน ack มันดีกว่า grep!)
Alan Storm

ack หรือ awk? ฉันชอบ awk ซึ่งเป็นภาษาโปรแกรมที่ฉันชอบ แต่มีคนใช้ grep เป็นประจำ ... มัน "สะอาดกว่า" สำหรับสิ่งที่เรียบง่ายนี้
Seaux

ไม่ใช่ awk, ack: betterthangrep.com เป็นการเปลี่ยน grep ด้านหลัง perl ที่ปรับให้เหมาะสมสำหรับโครงการที่ใช้รหัสการค้นหา มันยอดเยี่ยมมาก
Alan Storm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.