मैं एक फ़ाइल को स्कैन करने के लिए सभी परिभाषित कक्षाएं, कुछ भी वे का विस्तार, किसी भी बनाई उदाहरणों, और किसी भी समय वे स्थिर लागू किया गया लगता है tokenizer उपयोग करने के लिए कोशिश कर रहा हूँ।मैं PHP फ़ाइल में उपयोग की जाने वाली सभी कक्षाओं को कैसे ढूंढूं?
<?php
$tokens = token_get_all(file_get_contents($file));
$used_classes = array();
$defined_classes = array();
$variable_classes = array();
foreach($tokens as $i => $token) {
if(is_array($token)) {
if(isset($tokens[$i - 2][0], $tokens[$i - 1][0])) {
// new [class]
if ($tokens[$i - 2][0] == T_NEW AND $tokens[$i - 1][0] == T_WHITESPACE) {
if($tokens[$i][0] == T_STRING) {
$used_classes[$token[1]] = TRUE;
// new $variable()
} elseif($tokens[$i][0] == T_VARIABLE) {
// @todo, this is really broken. However, do best to look for the assignment
if(preg_match('~\$var\s*=\s*([\'"])((?:(?!\1).)*)\1~', $text, $match)) {
if(empty($extension_classes[$match[2]])) {
$used_classes[$match[2]] = TRUE;
}
} elseif($token[1] !== '$this') {
$variable_classes[$token[1]] = TRUE;
}
}
}
// class [class]
if ($tokens[$i - 2][0] == T_CLASS AND $tokens[$i - 1][0] == T_WHITESPACE) {
if($tokens[$i][0] == T_STRING) {
$defined_classes[$token[1]] = TRUE;
}
}
// @todo: find more classes \/
// class [classname] extends [class] ???
// [class]::method()???
}
}
}
ऊपर उल्लिखित PHP कक्षाओं के किसी भी अतिरिक्त उदाहरण को खोजने के लिए मैं इस कोड को कैसे बढ़ा सकता हूं?
- http://www.php.net/manual/en/tokens.php
- http://westhoffswelt.de/blog/class_dependency_graph_generation_update.html
- http://phpqatools.org/
PHP में जादू निरंतर __ फ़ाइल __ (बिना रिक्त स्थान के) है। आप इस फ़ाइल को खोल सकते हैं (fopen या file_get_contents) और preg_match (जैसे /^\s*class(.*)$/ और /(.*)::(.*)/ और इसी तरह) के माध्यम से इसे खोज सकते हैं। पता है कि काफी कठोर समाधान नहीं है तो शायद किसी को बेहतर मिलेगा। यदि आप सभी कक्षाएं खोजना चाहते हैं, तो आप फंक्शन get_declared_classes (http://php.net/manual/en/function.get-declared-classes.php) का उपयोग कर सकते हैं और इसलिए, याद रखें, कि कोर क्लासेस भी शामिल किए जाएंगे। – tomis
आपकी तीन सिफारिशों में से केवल रेगेक्स के साथ खोज करने के लिए PHP कोड के स्थिर विश्लेषण के साथ कुछ भी करना है। हालांकि, मैं रेगेक्स से बचने के बजाय PHP पार्सर अधिक विश्वासयोग्य होगा। मैं यह भी कल्पना नहीं कर सकता कि एक परिवर्तनीय चर खोजने के लिए रेगेक्स को कितना जटिल होना होगा। – Xeoncross
खैर, मुझे डर है कि आपको पूरा भरने का अनुरोध (क्लास परिभाषा और लक्ष्य फ़ाइल में कॉल ढूंढना) संभव नहीं है ... – tomis