कैसे पता लगाएं कि एक फ़ंक्शन कहाँ परिभाषित किया गया है?


109

मैं कैसे पता लगा सकता हूं कि किसी दिए गए फ़ंक्शन को किस फ़ाइल और लाइन में परिभाषित किया गया है?

जवाबों:


231

आप इसे PHP में भी कर सकते हैं:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

8
युक्ति: का $reflFunc->isInternal() === TRUEअर्थ है -> getFileName () और -> getStartLine () FALSE लौटाएगा।
बॉब स्टीन

यह अभी भी मेरे लिए अच्छा काम करता है। मैं लक्ष्य करना चाहूंगा जहां फ़ंक्शन को निकाल दिया जा रहा है, इसके बजाय जहां इसे परिभाषित किया जा रहा है।
एहर्मन

2
@ ईमैन मुझे नहीं लगता कि आप किसी फ़ंक्शन के कॉलर्स को प्रतिबिंब के साथ पा सकते हैं। यदि आप यह शायद इसके लिए अच्छी तरह से काम नहीं कर सकते क्योंकि PHP फाइलें मांग पर शामिल होती हैं, और इसलिए आपको संभवतः सभी कोड लोड नहीं होने चाहिए जो फ़ंक्शन को कॉल करता है।
टॉम हैघ

11
कक्षा के तरीकों के लिए आप उपयोग कर सकते हैं$reflFunc = new ReflectionMethod($this, 'method_name');
लादिस्लाव गैल

3
@ ईरमन आप डिबग_बैकट्रेस () में देख सकते हैं कि एक फंक्शन कहाँ बुलाया जा रहा है।
dotVezz

12

या तो एक आईडीई का उपयोग करें जो ऐसा करने की अनुमति देता है (मैं ग्रहण पीडीटी को पुनः प्राप्त करूँगा), या आप इसे लिनक्स पर कर सकते हैं या यदि लिनक्स पर, या विंगरेप का उपयोग कर सकते हैं। लिनक्स में यह कुछ इस तरह होगा:

grep -R "function funName" *

परियोजना के रूट फ़ोल्डर में से।


5
बेहतर है: grep -R "function \ sfunName" *
डेविड

3

यदि आप Netbeans की तरह एक IDE का उपयोग करते हैं, तो आप फ़ंक्शन उपयोग को CTRL + क्लिक कर सकते हैं और यह आपको वहाँ ले जाएगा जहाँ इसे परिभाषित किया गया है, यह मानते हुए कि फ़ाइल आपके द्वारा परिभाषित प्रोजेक्ट फ़ोल्डर के भीतर है।

हालांकि ऐसा करने के लिए कोई कोड या फ़ंक्शन नहीं है।


Zend Studio में भी और मुझे लगता है कि यह ग्रहण के लिए PDT के साथ भी काम करेगा।
गॉर्डन

@ गोर्डन "एक आईडीई जैसे" मुझे लगता है कि यह किसी भी आधुनिक आईडीई के लिए होना चाहिए ...
शुल्केला

2

मुझे लगता है कि "वर्णित" से आपका मतलब "परिभाषित" है। इसके लिए, आपको आदर्श रूप से एक सभ्य आईडीई की आवश्यकता है जो इसे कर सके।


मैं एप्टाना का उपयोग कर रहा हूं जिसमें परियोजना के माध्यम से पाठ खोज है लेकिन इसका उपयोग करने के लिए मुझे एक परियोजना के रूप में छेद (बहुत बड़ी) साइट को आयात करने की आवश्यकता है।
साल्टलेक

2

एक बुनियादी कार्य है जो एक विशिष्ट स्ट्रिंग के लिए आपकी संपूर्ण परियोजना फ़ाइलों को स्कैन करेगा और आपको बताएगा कि यह किस फ़ाइल में है और कौन सी चार्ट स्थिति में यह केवल मूल php का उपयोग करके शुरू होता है। उम्मीद है कि यह किसी की मदद करता है ...

<?php 
$find="somefunction()";

echo findString('./ProjectFolderOrPath/',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                            echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>

2

फ़ंक्शन को परिभाषित करने का एक और तरीका यह बताता है कि फ़ंक्शन को फिर से परिभाषित करने का प्रयास करें, PHP त्रुटि प्रणाली बस एक त्रुटि बताएगी जहां फ़ंक्शन परिभाषित किया गया है।


1

मुझे टॉम का समाधान पसंद है, इसलिए मुझे लगा कि मैं इसके साथ कुछ और ट्रिक्स साझा कर सकता हूं रिफ्लेक्शन (यह हर PHP 5 पर काम करना चाहिए):

  • फ़ाइल नाम मुद्रित करने के लिए एक-लाइनर:

    print (new ReflectionFunction("foo"))->getFileName();

कृपया ध्यान दें कि यह आपको आंतरिक कार्यों (जैसे कि) के लिए स्थान नहीं दिखाएगा _ ) के , लेकिन यह अभी भी नीचे के लिए एपीआई प्रिंट कर सकता है।

  • फ़ंक्शन की परिभाषा और मापदंडों को मुद्रित करने के लिए:

    print new ReflectionFunction("foo");

    उदाहरण:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }

0

आपको एक आईडीई की आवश्यकता होगी जो "ओपन फंक्शन घोषणा" कार्यक्षमता का समर्थन करता है। Php के लिए एक अच्छा है ग्रहण पीडीटी।

फ़ंक्शन की परिभाषा देखने के लिए, फ़ंक्शन का नाम हाइलाइट करें, CTRL + नाम पर क्लिक करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.