2014-08-30 4 views
7

देखें क्या एक PHP बंद ऑब्जेक्ट के स्रोत को प्रतिबिंबित करना या अन्यथा देखना संभव है? यही कारण है, अगर मैं इसएक PHP क्लोजर स्रोत

$closure = function() 
{ 
    return 'Hi There'; 
}; 

और फिर कुछ इस तरह की तरह कुछ करना

var_dump($closure); 

पीएचपी आउटपुट

object(Closure)[14] 

है, मुझे पता है वस्तु को बंद करने की है, लेकिन मेरे पास है नहीं पता कि यह क्या करता है।

मैं एक प्रतिबिंब विधि, फ़ंक्शन या डिबगिंग एक्सटेंशन की तलाश में हूं जो मुझे अज्ञात फ़ंक्शन के वास्तविक निकाय को डंप करने की अनुमति देगा।

उत्तर

10

PHP से आप क्या प्राप्त कर सकते हैं, प्रतिबिंब का उपयोग करके आप केवल फ़ंक्शन के पैरामीटर हस्ताक्षर और स्रोत कोड फ़ाइल की प्रारंभ और समाप्ति रेखा प्राप्त कर सकते हैं। http://www.metashock.de/2013/05/dump-source-code-of-closure-in-php/ ...

यह प्रतिबिंब का उपयोग कर, निम्न कोड के लिए मुझे नेतृत्व: मैं एक बार इस बारे में एक ब्लॉग लेख लिखा था गए

function closure_dump(Closure $c) { 
    $str = 'function ('; 
    $r = new ReflectionFunction($c); 
    $params = array(); 
    foreach($r->getParameters() as $p) { 
     $s = ''; 
     if($p->isArray()) { 
      $s .= 'array '; 
     } else if($p->getClass()) { 
      $s .= $p->getClass()->name . ' '; 
     } 
     if($p->isPassedByReference()){ 
      $s .= '&'; 
     } 
     $s .= '$' . $p->name; 
     if($p->isOptional()) { 
      $s .= ' = ' . var_export($p->getDefaultValue(), TRUE); 
     } 
     $params []= $s; 
    } 
    $str .= implode(', ', $params); 
    $str .= '){' . PHP_EOL; 
    $lines = file($r->getFileName()); 
    for($l = $r->getStartLine(); $l < $r->getEndLine(); $l++) { 
     $str .= $lines[$l]; 
    } 
    return $str; 
} 

आप निम्नलिखित बंद हों:

$f = function (Closure $a, &$b = -1, array $c = array()) 
    use ($foo) 
{ 
    echo $this->name; 
    echo 'test'; 
}; 

closure_dump() निम्नलिखित परिणाम देगा:

function (Closure $a, &$b = -1, array $c = array (
)){ 
use ($foo) 
{ 
    echo $this->name; 
    echo 'test'; 
}; 

तुम देखो यह है अपूर्ण (सरणी परम)। इसके अलावा यह कुछ किनारे के मामलों को सही तरीके से संभाल नहीं पाएगा, विशेष रूप से अगर बंद घोंसले होते हैं या एकाधिक इनलाइन क्लोजर एक लाइन में किसी फ़ंक्शन में पास हो जाएंगे। उत्तरार्द्ध मेरे लिए सबसे अधिक समस्याग्रस्त दिखता है। चूंकि, आपको प्रतिबिंब से केवल आरंभिक और समाप्ति रेखा मिलती है, इस मामले में दोनों कार्य उस पंक्ति पर होंगे और आपके पास यह तय करने के लिए कोई उपयोगी जानकारी नहीं है कि उनमें से कौन सा डंप हो जाना चाहिए। अब तक, मुझे इसके लिए कोई समाधान नहीं मिला, मुझे कोई समाधान होने पर भी अनिश्चितता है।

हालांकि, ज्यादातर मामलों में, इसे कम से कम डिबगिंग के लिए सहायक होना चाहिए, जब तक कि आप इस पर भरोसा न करें। Feel free to enhance it!

+0

eval() का उपयोग किये बिना संशोधन के बाद परिणामस्वरूप कोड का मूल्यांकन कैसे किया जा सकता है? – Omranic

+0

* संशोधन के बाद * के साथ आपका क्या मतलब है? – hek2mgl

+0

मुझे पता है कि यह पुराना है, लेकिन यह अभी भी मेरे लिए एक मामला है .. ठीक है, संशोधन के बाद इसका मतलब है कि मैंने परिलक्षित क्लोजर कोड लिया है, कुछ लाइनों को हटा दिया है और दूसरों को जोड़ा है, और चूंकि यह अब सिर्फ एक स्ट्रिंग है, मुझे मूल्यांकन करना होगा eval() – Omranic

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