Klassen analysieren (Liste Methoden etc.)

Wäre nett, wenn du deine Lösung mal posten würdest, falls andere auch dieses Problem haben.
MfG, Andy
 
Habe ich doch oben schon größtenteils...
Naja hier nochmal alles.

Müsst ihr euch dann selbst auseinander fummeln ;)

PHP:
<?php

class inc_admin_development extends IncludeModelAdmin {
	
	protected function get_needed_parameters() {
		return 'act';
	}
	
	public function get_title_extention() {
		return null;
	}
	
	public function get_operation_overview() {
		$development = new ActionArea('development');
		$development->add_method(new Action('acd','Klassendetails AdminModule'));
		$development->add_method(new Action('usm','Usermodule die zur Suche gehören'));
		$development->add_method(new Action('udm','Usermodule die Title und Metatags erweitern'));
		
		return $development;
	}
	
	protected function show_content_of_admin_file() {
		$action = $this->file_parameters['act'];
		
		if (isset($action)) {
			
			if ($action == 'acd') {
				$this->get_admin_class_details();
			}
			else if ($action == 'usm') {
				$this->get_user_search_methods();
			}
			else if ($action == 'udm') {
				$this->get_keyword_descr_methods();
			}
			else {
				$this->draw_wrong_parameter();
			}
			
		}
		else {
			$this->draw_wrong_parameter();
		}
	}
	
	private function get_keyword_descr_methods() {
		$this->include_of_folders(array('public', 'admin'));
		
		$this->draw_header('Seiten die den Title erweitern');
		$this->show_classes_implementing('get_title_extention');
		$this->draw_bottom();
		
		$this->draw_header('Seiten die MetaTags erweitern');
		$this->show_classes_implementing('add_meta_tags');
		$this->draw_bottom();
	}
	
	private function get_user_search_methods() {
		$this->include_of_folders(array('public'));
		
		$this->draw_header('Benutzerklassen die beim Suchen genutzt werden');
		$this->show_classes_implementing('search_string');
		$this->draw_bottom();
	}
	
	private function get_admin_class_details() {
		
		$this->include_of_folders(array('admin'));
		
		$this->draw_header('Übersicht aller Klassen (Admin)');
		
		$classes = get_declared_classes();
		asort($classes);
		foreach ($classes as $class) {
			// Prüfen ob es sich um eine Klasse von mir handelt
			if (substr($class, 0, 3) == CLASS_PREFIX) {
				$reflect = new ReflectionClass($class);
				
				$this->draw_content_begin();
				
				$abstract_class = $reflect->isAbstract() ? '<i>abstract</i> ' : '';
				echo $abstract_class.'<b>'.$class.'</b> ('.($reflect->getEndline()-$reflect->getStartLine()).' Zeilen)<br />'; 
				
				// Gibt die Klassenhierarchie aus
				$parent = $reflect;
				while (($parent = $parent->getParentClass()) != null) {
					echo '&raquo; '.$parent->getName().'<br />';
				}
				
				$this->draw_content_end();
				$this->draw_content_begin();
				
				echo '
				Überschriebene Methoden:
				<table class="details">';
				
				foreach ($reflect->getMethods() as $method) {
					// Nur die Methoden anzeigen die nicht vererbt wurden
					if ($method->getDeclaringClass()->getName() == $class && $this->is_overwritten($reflect, $method)) {
						$this->show_method_details($method);
					}
				}
				
				echo '</table>';
				
				$this->draw_content_end();
				$this->draw_content_begin();
				
				echo '
				Neue Methoden:
				<table class="details">';
				
				foreach ($reflect->getMethods() as $method) {
					// Nur die Methoden anzeigen die nicht vererbt wurden
					if ($method->getDeclaringClass()->getName() == $class && !$this->is_overwritten($reflect, $method)) {
						$this->show_method_details($method);
					}
				}
				
				echo '</table>';
				
				$this->draw_content_end();
				$this->draw_devider();
			}
		}
		
		$this->draw_bottom();
	}
	
	private function show_classes_implementing($methodname) {
		$this->draw_content_begin();
		
		$classes = get_declared_classes();
		asort($classes);
		foreach ($classes as $class) {
			// Prüfen ob es sich um eine Klasse von mir handelt
			if (substr($class, 0, 3) == CLASS_PREFIX) {
				$reflect = new ReflectionClass($class);
				
				if ($reflect->hasMethod($methodname) && $reflect->getMethod($methodname)->getDeclaringClass()->getName() == $class) {
					echo '<b>'.$class.'</b> ('.($reflect->getEndline()-$reflect->getStartLine()).' Zeilen)<br />'; 
				}
			}
		}
		
		$this->draw_content_end();
	}
	
	private function include_of_folders($scanfolders) {
		foreach ($scanfolders as $scanfolder) {
			
			$pfad = './links/'.$scanfolder.'/';
			$verz = opendir($pfad);
			
			while ($file = readdir($verz)) {
				
				if (filetype($pfad.$file) != "dir" && substr($pfad.$file, strlen($pfad.$file)-3, 3) == 'php') {
					include_once($pfad.$file);
				}
				
			}
			
		}
	}
	
	private function is_overwritten($class, $method) {
		$ret = false;
		
		if ($class instanceof ReflectionClass && $method instanceof ReflectionMethod) {
			// Prüfen ob die übergebene Klasse überhaupt die Methode implementiert
			if ($class->hasMethod($method->getName())) {
				// Prüfen ob eine der Elternklassen die Methode bereits implementiert
				$parent = $class;
				while (($parent = $parent->getParentClass()) != null) {
					if ($parent->hasMethod($method->getName())) {
						$ret = true;
					}
				}
			}
		}
		
		return $ret;
	}
	
	private function show_method_details($method) {
		if ($method instanceof ReflectionMethod) {
			$params = '';
			$paramcount = 0;
			foreach ($method->getParameters() as $param) {
				$params .= ($param->isPassedByReference()) ? '&' : '';
				$params .= '$'.$param->getName();
				$params .= (++$paramcount < $method->getNumberOfParameters()) ? ', ' : '';
			}
			
			echo '
			<tr>
				<td class="tableleft">
					'.implode(' ', Reflection::getModifierNames($method->getModifiers())).'
				</td>
				<td class="tableright">
					<b>'.$method->getName().'</b>('.$params.')
				</td>
			</tr>
			';
		}
	}
	
}

?>
 
Zurück