दिलचस्प पोस्ट
$ है (दस्तावेज़)। आवश्यक है? सी ++ में बिटमैप ऑब्जेक्ट के रूप में खिड़की का स्क्रीनशॉट कैसे प्राप्त करें? सी #: ऑब्जेक्ट की एक सूची को उस ऑब्जेक्ट की एक संपत्ति की सूची में कनवर्ट कैसे करें? पी का उपयोग कैसे करें: पीढ़ी के भीतर स्ट्रीमिंग कंटेंट के साथ ग्राफिक इमेज: डेटाटेबल? एक निश्चित कुंजी द्वारा बहुआयामी सरणी कैसे सॉर्ट करें? Chart.js – एक मनमाना ऊर्ध्वाधर रेखा खींचना एंड्रॉइड फेसबुक प्राधिकरण – आधिकारिक फेसबुक एप स्थापित होने पर लॉग इन नहीं कर सकते निर्धारित करें कि यदि फ़ंक्शन मौजूद है तो बाश में MySQL और जेडीबीसी के साथ दोबारा लिखे गए स्टैटमेंट्स = सच Jquery का उपयोग कर एक अभिभावक div का आईडी ढूँढना सेट का उपयोग किए बिना सरणी से डुप्लिकेट को कुशलता से कैसे निकालें VB.NET क्लास या मॉड्यूल का क्या उद्देश्य है? क्या एक विशेषता चयनकर्ता के बीच में एक सीएसएस वाइल्डकार्ड का उपयोग करना संभव है? रेडियो बटन "पठनीय" क्यों नहीं हो सकते? मैं एक PHP घातक त्रुटि कैसे प्राप्त करूं?

निर्धारित करना कि कक्षाओं को PHP क्लास फ़ाइल में किस प्रकार परिभाषित किया गया है

यह देखते हुए कि हमारे प्रोजेक्ट में प्रत्येक PHP फ़ाइल में एक एकल वर्ग की परिभाषा होती है, मैं यह कैसे निर्धारित कर सकता हूं कि फ़ाइल के भीतर कौन सी कक्षा या कक्षाएं निर्धारित हैं?

मुझे पता है कि मैं सिर्फ class स्टेटमेंट के लिए फाइल को फिर से कर सकता हूं, लेकिन मैं कुछ ऐसा करना पसंद करता हूं जो कि अधिक कुशल है

वेब के समाधान से एकत्रित समाधान "निर्धारित करना कि कक्षाओं को PHP क्लास फ़ाइल में किस प्रकार परिभाषित किया गया है"

मुझे इस तरह से एक ऐसी परियोजना की आवश्यकता है, जिस पर मैं काम कर रहा हूं, और यहां लिखा गया कार्य हैं:

 function file_get_php_classes($filepath) { $php_code = file_get_contents($filepath); $classes = get_php_classes($php_code); return $classes; } function get_php_classes($php_code) { $classes = array(); $tokens = token_get_all($php_code); $count = count($tokens); for ($i = 2; $i < $count; $i++) { if ( $tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { $class_name = $tokens[$i][1]; $classes[] = $class_name; } } return $classes; } 

अगर आप किसी फ़ाइल को लोड किए बिना चेक करना चाहते हैं तो इसे token_get_all() उपयोग करें:

 <?php header('Content-Type: text/plain'); $php_file = file_get_contents('c2.php'); $tokens = token_get_all($php_file); $class_token = false; foreach ($tokens as $token) { if (is_array($token)) { if ($token[0] == T_CLASS) { $class_token = true; } else if ($class_token && $token[0] == T_STRING) { echo "Found class: $token[1]\n"; $class_token = false; } } } ?> 

असल में, यह एक सरल परिमित राज्य मशीन है PHP में टोकन का क्रम होगा:

  • T_CLASS : 'वर्ग' कीवर्ड;
  • T_WHITESPACE : 'वर्ग' के बाद स्थान (एस);
  • T_STRING : कक्षा का नाम।

तो यह कोड किसी भी अजीब रिक्ति या नई लाइनों को संभालता है जो आपको ठीक से मिलता है क्योंकि यह फ़ाइल को निष्पादित करने के लिए उसी पार्सर PHP का उपयोग करता है। यदि token_get_all() इसे पार्स नहीं कर सकता, तो न ही PHP कर सकते हैं

वैसे, आप टोकन नंबर को इसके निरंतर नाम में बदलने के लिए token_name() का उपयोग करते हैं।

यहाँ मेरी सी 2। PHP है:

 <?php class MyClass { public __construct() { } } class MyOtherClass { public __construct() { } } ?> 

आउटपुट:

 Found class: MyClass Found class: MyOtherClass 

मुझे नाम स्थान के साथ फ़ाइल से पार्स वर्ग की आवश्यकता है, इसलिए मैंने कोड को संशोधित किया। अगर किसी को भी जरूरत है, तो यह है:

 public function getPhpClasses($phpcode) { $classes = array(); $namespace = 0; $tokens = token_get_all($phpcode); $count = count($tokens); $dlm = false; for ($i = 2; $i < $count; $i++) { if ((isset($tokens[$i - 2][1]) && ($tokens[$i - 2][1] == "phpnamespace" || $tokens[$i - 2][1] == "namespace")) || ($dlm && $tokens[$i - 1][0] == T_NS_SEPARATOR && $tokens[$i][0] == T_STRING)) { if (!$dlm) $namespace = 0; if (isset($tokens[$i][1])) { $namespace = $namespace ? $namespace . "\\" . $tokens[$i][1] : $tokens[$i][1]; $dlm = true; } } elseif ($dlm && ($tokens[$i][0] != T_NS_SEPARATOR) && ($tokens[$i][0] != T_STRING)) { $dlm = false; } if (($tokens[$i - 2][0] == T_CLASS || (isset($tokens[$i - 2][1]) && $tokens[$i - 2][1] == "phpclass")) && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { $class_name = $tokens[$i][1]; if (!isset($classes[$namespace])) $classes[$namespace] = array(); $classes[$namespace][] = $class_name; } } return $classes; } 

या आप Nette \ Reflection ( इंस्टॉलर का उपयोग करने योग्य) से एनोटेशनपर्सर आसानी से उपयोग कर सकते हैं:

 use Nette\Reflection\AnnotationsParser; $classes = AnnotationsParser::parsePhp(file_get_contents($fileName)); var_dump($classes); 

आउटपुट तब कुछ ऐसा होगा:

 array(1) { ["Your\Class\Name"] => array(...) { // property => comment }, ["Your\Class\Second"] => array(...) { // property => comment }, } 

ParsePhp () विधि मूल रूप से अन्य जवाबों में उदाहरण के समान है, लेकिन आपको खुद को पार्स करने की घोषणा या न ही परीक्षण करना पड़ता है

मेरा स्निपेट भी एकाधिक वर्गों, इंटरफेस, सरणियों और नामस्थान के साथ फ़ाइलें पार्स कर सकते हैं। वर्गों + प्रकारों (कक्षा, इंटरफ़ेस, सार) के नाम से विभाजित करके सरणी लौटाता है।

 <?php /** * * Looks what classes and namespaces are defined in that file and returns the first found * @param String $file Path to file * @return Returns NULL if none is found or an array with namespaces and classes found in file */ function classes_in_file($file) { $classes = $nsPos = $final = array(); $foundNS = FALSE; $ii = 0; if (!file_exists($file)) return NULL; $er = error_reporting(); error_reporting(E_ALL ^ E_NOTICE); $php_code = file_get_contents($file); $tokens = token_get_all($php_code); $count = count($tokens); for ($i = 0; $i < $count; $i++) { if(!$foundNS && $tokens[$i][0] == T_NAMESPACE) { $nsPos[$ii]['start'] = $i; $foundNS = TRUE; } elseif( $foundNS && ($tokens[$i] == ';' || $tokens[$i] == '{') ) { $nsPos[$ii]['end']= $i; $ii++; $foundNS = FALSE; } elseif ($i-2 >= 0 && $tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { if($i-4 >=0 && $tokens[$i - 4][0] == T_ABSTRACT) { $classes[$ii][] = array('name' => $tokens[$i][1], 'type' => 'ABSTRACT CLASS'); } else { $classes[$ii][] = array('name' => $tokens[$i][1], 'type' => 'CLASS'); } } elseif ($i-2 >= 0 && $tokens[$i - 2][0] == T_INTERFACE && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { $classes[$ii][] = array('name' => $tokens[$i][1], 'type' => 'INTERFACE'); } } error_reporting($er); if (empty($classes)) return NULL; if(!empty($nsPos)) { foreach($nsPos as $k => $p) { $ns = ''; for($i = $p['start'] + 1; $i < $p['end']; $i++) $ns .= $tokens[$i][1]; $ns = trim($ns); $final[$k] = array('namespace' => $ns, 'classes' => $classes[$k+1]); } $classes = $final; } return $classes; } 

इस तरह से कुछ आउटपुट …

 array 'namespace' => string 'test\foo' (length=8) 'classes' => array 0 => array 'name' => string 'bar' (length=3) 'type' => string 'CLASS' (length=5) 1 => array 'name' => string 'baz' (length=3) 'type' => string 'INTERFACE' (length=9) array 'namespace' => string 'this\is\a\really\big\namespace\for\testing\dont\you\think' (length=57) 'classes' => array 0 => array 'name' => string 'yes_it_is' (length=9) 'type' => string 'CLASS' (length=5) 1 => array 'name' => string 'damn_too_big' (length=12) 'type' => string 'ABSTRACT CLASS' (length=14) 2 => array 'name' => string 'fodass' (length=6) 'type' => string 'INTERFACE' (length=9) 

किसी को मदद कर सकते हैं!

PHP के फ़ंक्शन का उपयोग करें get_declared_classes () यह मौजूदा स्क्रिप्ट में निर्धारित कक्षाओं की एक सरणी देता है।

मैंने वेंकट डी के तरीकों को वापस लाने, और एक निर्देशिका के माध्यम से खोज करने के लिए कुछ का जवाब दिया है। (यह विशिष्ट उदाहरण कोडइग्नेटर के लिए बनाया गया है, जो ./system/application/controller फ़ाइलों में सभी तरीकों को वापस करेगा – दूसरे शब्दों में, हर सार्वजनिक यूआरएल जिसे आप सिस्टम के माध्यम से कॉल कर सकते हैं।)

 function file_get_php_classes($filepath,$onlypublic=true) { $php_code = file_get_contents($filepath); $classes = get_php_classes($php_code,$onlypublic); return $classes; } function get_php_classes($php_code,$onlypublic) { $classes = array(); $methods=array(); $tokens = token_get_all($php_code); $count = count($tokens); for ($i = 2; $i < $count; $i++) { if ($tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { $class_name = $tokens[$i][1]; $methods[$class_name] = array(); } if ($tokens[$i - 2][0] == T_FUNCTION && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) { if ($onlypublic) { if ( !in_array($tokens[$i-4][0],array(T_PROTECTED, T_PRIVATE))) { $method_name = $tokens[$i][1]; $methods[$class_name][] = $method_name; } } else { $method_name = $tokens[$i][1]; $methods[$class_name][] = $method_name; } } } return $methods; } function mapSystemClasses($controllerdir="./system/application/controllers/",$onlypublic=true) { $result=array(); $dh=opendir($controllerdir); while (($file = readdir($dh)) !== false) { if (substr($file,0,1)!=".") { if (filetype($controllerdir.$file)=="file") { $classes=file_get_php_classes($controllerdir.$file,$onlypublic); foreach($classes as $class=>$method) { $result[]=array("file"=>$controllerdir.$file,"class"=>$class,"method"=>$method); } } else { $result=array_merge($result,mapSystemClasses($controllerdir.$file."/",$onlypublic)); } } } closedir($dh); return $result; } 

आप इस तरह से सार वर्गों को अनदेखा कर सकते हैं (T_ABSTRACT टोकन नोट करें):

 function get_php_classes($php_code) { $classes = array(); $tokens = token_get_all($php_code); $count = count($tokens); for ($i = 2; $i < $count; $i++) { if ($tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING && !($tokens[$i - 3] && $i - 4 >= 0 && $tokens[$i - 4][0] == T_ABSTRACT)) { $class_name = $tokens[$i][1]; $classes[] = $class_name; } } return $classes; }