2012-02-02 4 views
5

एक छोटी सी उत्सुक करता है, लेकिन मैं वर्गों है कि मैं इसउपयोग get_declared_class() केवल ouput है कि कक्षाओं में मैं लोगों को नहीं घोषित पीएचपी स्वचालित रूप से

foreach(get_declared_classes() as $class) 
    $c[] = $class; 


print_r($c); 

की तरह कुछ का उपयोग कर घोषणा की है से बाहर एक सरणी बनाना चाहते

stdClass 
Exception 
ErrorException 
Closure 
DateTime 
DateTimeZone 
DateInterval 
DatePeriod 
LibXMLError 
LogicException 
BadFunctionCallException 
BadMethodCallException 
DomainException 
InvalidArgumentException 
LengthException 
OutOfRangeException 
RuntimeException 
OutOfBoundsException 
OverflowException 
RangeException 
UnderflowException 
UnexpectedValueException 
RecursiveIteratorIterator 
IteratorIterator 
{...} 
SQLiteResult 
SQLiteUnbuffered 
SQLiteException 
SQLite3 
SQLite3Stmt 
SQLite3Result 
XMLReader 
XMLWriter 
XSLTProcessor 
ZipArchive 

वहाँ एक समारोह है कि केवल सिस्टम लोड वर्गों के बजाय उपयोगकर्ता विशिष्ट वर्गों को लोड करता है: उस के साथ ही समस्या यह है कि मैं अपने लोड कक्षाओं के शीर्ष पर कुछ ऐसा प्राप्त है? या शायद एक शर्त कथन जो उन वर्गों को सूचीबद्ध करने के लिए foreach को सीमित करता है?

+3

FWIW: अपने पाश एक सरल 'print_r के रूप में सटीक एक ही बात कर रहा है (get_declared_classes())'। आपके प्रश्न का उत्तर नहीं देता है, लेकिन कोड को सरल बनाता है। – deceze

+0

@ एली, मेरा जवाब देखें। यह एक समाधान प्रदान करता है जो वैश्विक चर को इंगित नहीं करता है और प्रदर्शन को प्रभावित नहीं करता है। आपको शायद स्वीकार्य उत्तर अपडेट करना चाहिए। https: // stackoverflow।कॉम/ए/46126712/1050262 –

उत्तर

1

मेरा समाधान है जो वास्तव में प्रदर्शन को प्रभावित करता है और नीचे नहीं करता है। यह आपको केवल आपके प्रोजेक्ट में परिभाषित कक्षाएं देता है, और कुछ भी नहीं। सभी कक्षाएं लोड होने के बाद, जितनी देर हो सके इसे चलाने के लिए सुनिश्चित करें।

/** 
* Get all classes from a project. 
* 
* Return an array containing all classes defined in a project. 
* 
* @param string $project_path 
* @return array 
*/ 
function smk_get_classes_from_project($project_path){ 
    // Placeholder for final output 
    $classes = array(); 

    // Get all classes 
    $dc = get_declared_classes(); 

    // Loop 
    foreach ($dc as $class) { 
     $reflect = new \ReflectionClass($class); 

     // Get the path to the file where is defined this class. 
     $filename = $reflect->getFileName(); 

     // Only user defined classes, exclude internal or classes added by PHP extensions. 
     if(! $reflect->isInternal()){ 

      // Replace backslash with forward slash. 
      $filename = str_replace(array('\\'), array('/'), $filename); 
      $project_path = str_replace(array('\\'), array('/'), $project_path); 

      // Remove the last slash. 
      // If last slash is present, some classes from root will not be included. 
      // Probably there's an explication for this. I don't know... 
      $project_path = rtrim($project_path, '/'); 

      // Add the class only if it is defined in `$project_path` dir. 
      if(stripos($filename, $project_path) !== false){ 
       $classes[] = $class; 
      } 

     } 
    } 

    return $classes;  
} 

इसका परीक्षण करें।

इस उदाहरण में कल्पना परियोजना इस मार्ग है: /srv/users/apps/my-project-name

echo '<pre>'; 
print_r(smk_get_classes_from_project('/srv/users/apps/my-project-name')); 
echo '</pre>'; 
11

इसे प्राप्त करने के लिए कोई अंतर्निहित कार्य नहीं है, लेकिन आप कुछ भी घोषित करने से पहले get_declared_classes कर सकते हैं और इसे वैश्विक चर में स्टोर कर सकते हैं, $predefinedClasses कहें। फिर, जहाँ आप का उपयोग की जरूरत है:

print_r(array_diff(get_declared_classes(), $predefinedClasses)); 
4

थेरेस कोई सीधे बिल्ट-इन इस के लिए संभावना है, लेकिन आप निम्न कर सकते हैं: अपनी स्क्रिप्ट की शुरुआत में

  1. , get_declared_classes() फोन और यह savve $php_classes
  2. की तरह एक चर अपनी कक्षाओं लोड करने के बाद करने के लिए, get_declared_classes() फिर से फोन और array_diff() का उपयोग $php_classes को फिल्टर करने की - परिणाम अपनी खुद की कक्षाओं की एक सूची है।

    // start 
    $php_classes = get_declared_classes(); 
    
    // ... 
    // some code loading/declaring own classes 
    // ... 
    
    // later 
    $my_classes = array_diff(get_declared_classes(), $php_classes); 
    
+0

क्या मैं इसे निर्माण के भीतर वैश्विक दायरे में उपयोग कर सकता हूं? – Eli

+0

$ ग्लोबल्स ['php_classes'] – dmitry

+0

फिट होगा, धन्यवाद, मैं पूछताछ करने जा रहा था कि कॉन्स्टक्ट में वैश्विक चर का उपयोग कैसे करें = – Eli

13

प्रतिबिंब एपीआई का पता लगा सकते हैं कि क्या एक वर्ग आंतरिक है या नहीं:

उदाहरण (demo/alternate):

$userDefinedClasses = array_filter(
    get_declared_classes(), 
    function($className) { 
     return !call_user_func(
      array(new ReflectionClass($className), 'isInternal') 
     ); 
    } 
); 

उपरोक्त कोड get_declared_classes द्वारा लौटाई गई प्रत्येक कक्षा को चेक और हटा देगा जो आंतरिक है, केवल उपयोगकर्ता परिभाषित कक्षाओं को छोड़कर। इस तरह, आपको इस पृष्ठ पर कहीं और सुझाए गए आंतरिक वर्गों की एक सरणी बनाने और बनाए रखने की आवश्यकता नहीं है।

+0

उस संदर्भ में '$ className' चर क्या है? – Eli

+0

@ s2xi 'get_declared_classes' क्लासनामों की एक सरणी देता है। 'array_filter' इन क्लासनामों में से प्रत्येक को अज्ञात फ़ंक्शन ('$ className') में पास कर देगा और उन सरणी से हटा देगा जिनके लिए अनाम फ़ंक्शन' झूठा 'लौटाता है। अनाम कार्य उस वर्गनाम के लिए एक नया प्रतिबिंब क्लास उदाहरण बनाएगा और 'ReflectionClass :: isInternal' (एक बूलियन) का परिणाम वापस कर देगा। '!' परिणाम को नकारता है क्योंकि हम केवल उन कक्षाओं को अनुमति देना चाहते हैं जो आंतरिक नहीं हैं। – Gordon

+0

@ s2xi मैंने जुड़े वैकल्पिक संस्करण की जांच की है। समझना आसान हो सकता है। – Gordon

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