PHP फ़ाइल (रन टाइम पर) को खोजना जहां एक कक्षा को परिभाषित किया गया था


111

क्या PHP में कोई प्रतिबिंब / आत्मनिरीक्षण / जादू है जो आपको PHP फ़ाइल ढूंढने देगा जहाँ एक विशेष वर्ग (या फ़ंक्शन) को परिभाषित किया गया था?

दूसरे शब्दों में, मेरे पास एक PHP वर्ग, या एक तात्कालिक वस्तु का नाम है। मैं इसे कुछ (फ़ंक्शन, परावर्तन वर्ग, आदि) पास करना चाहता हूं जो फ़ाइल सिस्टम पथ को वापस कर देगा जहां कक्षा को परिभाषित किया गया था।

/path/to/class/definition.php

मुझे लगता है कि मैं ( get_included_files())अब तक शामिल की गई सभी फाइलों की सूची प्राप्त करने के लिए उपयोग कर सकता हूं और फिर उन सभी को मैन्युअल रूप से पार्स कर सकता हूं, लेकिन यह एक एकल प्रयास के लिए बहुत अधिक फ़ाइल सिस्टम एक्सेस है।

मुझे यह भी एहसास है कि मैं हमारे __autoload तंत्र में कुछ अतिरिक्त कोड लिख सकता हूं जो इस जानकारी को कहीं और कैश करता है। हालाँकि, मौजूदा __autoload को संशोधित करना उस स्थिति में बंद है जो मेरे मन में है।

एक्सटेंशन के बारे में सुनकर ऐसा करना दिलचस्प हो सकता है, लेकिन मैं अंततः कुछ ऐसा चाहूंगा जो "स्टॉक" इंस्टॉल पर चल सके।


2
मैगेंटो मुझे यहाँ लाया: -]
एलन

@ कुछ संपत्ति का नाम देखने में अच्छा लगता है।
एलन स्टॉर्म

जवाबों:


225

प्रयत्न ReflectionClass

उदाहरण:

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

यह falseतब वापस आएगा जब फ़ाइल नाम नहीं मिल सकता है, उदाहरण के लिए देशी कक्षाएं।


10

एक नामांकित फ़ाइल में ReflectionClass के लिए, इसे बनाने के लिए एक उपसर्ग "\" जोड़ें, जो निम्नानुसार वैश्विक है:

$ रिफ्लेक्टर = new \ ReflectionClass ('FOO');

या फिर, यह एक त्रुटि उत्पन्न करेगा ने कहा कि एक नामस्थान में ReflectionClass परिभाषित नहीं है। मेरे पास उपरोक्त उत्तर के लिए टिप्पणी करने का अधिकार नहीं था, इसलिए मैं इसे एक पूरक उत्तर के रूप में लिखता हूं।


0

यदि आप एक फ़ोल्डर शामिल था, तो आप ऐसा करके "वर्ग $ className" के लिए "grep" करने के लिए एक खोल स्क्रिप्ट आदेश चला सकता है: $filename = ``grep -r "class $className" $includesFolder/*\और यह वापसी होगी जो फ़ाइल यह था उसके अलावा, मुझे नहीं लगता कोई जादू नहीं है है। PHP के लिए यह फिर से करने के लिए कार्य करते हैं।


3
ईमानदार, गैर-गधे की जिज्ञासा। आपको क्या लगता है कि यह उत्तर उस विचार से बेहतर था जिसे मैंने पहले ही माना था और अस्वीकार कर दिया था? "मुझे लगता है कि मैं (get_included_files ()) उन सभी फ़ाइलों की एक सूची प्राप्त करने के लिए उपयोग कर सकता हूं, जिन्हें अब तक शामिल किया गया है और फिर उन सभी को मैन्युअल रूप से पार्स कर सकते हैं, लेकिन यह एकल प्रयास के लिए बहुत सारे फ़ाइल सिस्टम एक्सेस है।"
एलन स्टॉर्म

क्योंकि इसकी एक पंक्ति हालांकि कई पंक्तियों के विपरीत है जो PHP में एक पार्सर लिखने के लिए लेती है और grep फ़ंक्शन को C संकलित किया जाता है, मुझे लगता है, और जो कुछ भी लिखा गया है उससे अधिक तेजी से संभव है।
Seaux

आह, समझ गया। मेरी वास्तविक चिंता यह करने के लिए बार-बार फ़ाइलों में से प्रत्येक के लिए डिस्क का उपयोग दोहराया गया था (यह ऐसा कुछ है जो मेरे द्वारा बनाए जा रहे टूल में बहुत कुछ होगा) और कोड की मात्रा नहीं जिसे मैं आगे स्पष्ट करने की कोशिश करूंगा समय। (FYI करें: आपको ऐक में देखना चाहिए। यह grep से बेहतर है!)
एलन स्टॉर्म

ack या awk? मुझे अजीब लगता है, वास्तव में मेरी fav प्रोग्रामिंग भाषा, लेकिन अधिक लोग नियमित रूप से grep का उपयोग करते हैं ... सामान के लिए इसका "क्लीनर" इस ​​सरल
Seaux

Awk नहीं, ack: betterthangrep.com यह perl back grep प्रतिस्थापन है जो खोज कोड आधारित परियोजनाओं के लिए अनुकूलित है। यह बहुत अच्छा है।
एलन स्ट्रॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.