2011-07-14 9 views
6

क्या मैं कॉलिंग पर्यावरण के दायरे को कॉल किए गए फ़ंक्शन के भीतर से एक्सेस कर सकता हूं?एक PHP फ़ंक्शन में कॉलिंग कॉल प्राप्त करें?

उदाहरण के लिए, मैं लॉगिंग फ़ंक्शन में __LINE__ तक पहुंच बनाना चाहता हूं लेकिन कॉलिंग वातावरण से __LINE__ होना आवश्यक है। कॉलर्स चर प्राप्त करने के लिए मैं get_defined_vars() पर कॉल करने का कुछ तरीका भी लेना चाहता हूं।

दोनों उदाहरणों में यह एक अतिरिक्त तर्क प्राप्त करने के लिए बचाता है।

क्या यह संभव है?

+1

यदि आप * ऐसा कर सकते हैं, तो आपको अंततः यह पता चल जाएगा कि यह क्या बुरा विचार है (लॉगिंग के बाहर, वैसे भी)। – Nicole

+0

@ उत्पत्ति: केवल यही नहीं। कॉलिंग स्कोप प्राप्त करने में सक्षम होने से पैरामीटर पास करने के उद्देश्य को पूरी तरह से हराया जाएगा। – pyon

+0

मुझे नहीं लगता कि शीर्ष के नीचे स्टैक फ्रेम में परिभाषित चर प्राप्त करना संभव है। – GWW

उत्तर

0

कॉलर्स के चर प्राप्त करने का कोई तरीका नहीं है, लेकिन आप उनके तर्क प्राप्त कर सकते हैं। यह आसानी से debug_backtrace() साथ किया जाता है:

<?php 

class DebugTest 
{ 
    public static function testFunc($arg1, $arg2) { 
     return self::getTrace(); 
    } 

    private static function getTrace() { 
     $trace = debug_backtrace(); 
     return sprintf(
      "This trace function was called by %s (%s:%d) with %d %s: %s\n", 
      $trace[1]["function"], 
      $trace[1]["file"], 
      $trace[1]["line"], 
      count($trace[1]["args"]), 
      count($trace[1]["args"]) === 1 ? "argument" : "arguments", 
      implode(", ", $trace[1]["args"]) 
     ); 
    } 
} 

echo DebugTest::testFunc("foo", "bar"); 

इस कार्यक्रम चल रहा है, हम इस उत्पादन प्राप्त करें:

This trace function was called by testFunc (/Users/mike/debug.php:23) with 2 arguments: foo, bar 

debug_backtrace() एक सरणी देता है; तत्व 0 वह फ़ंक्शन है जिसमें फ़ंक्शन को स्वयं कहा जाता था, इसलिए हम उदाहरण में तत्व 1 का उपयोग करते हैं। आप ट्रेस का बैक अप लेने के लिए यात्रा करने के लिए एक लूप का उपयोग कर सकते हैं।

0

सॉर्ट करें, लेकिन ऐसा नहीं है कि उत्पादन कोड में उपयोग करना बुद्धिमान होगा।

दोनों उदाहरणों में यह अतिरिक्त तर्क प्राप्त करने के लिए बचाता है।

यह आपके कोड को समझने में बहुत मुश्किल बना देगा, क्योंकि आप एक फ़ंक्शन के अंतर्निहित encapsulation को तोड़ देंगे।

सभी ने कहा, आप इसके लिए वैश्विक चर का उपयोग कर सकते हैं?

संबंधित मुद्दे