login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Handige scripts > classNameScanner 0.0.1

classNameScanner 0.0.1

Auteur: Richard - 05 april 2009 - 15:32 - Gekeurd door: Koen - Hits: 2604 - Aantal punten: 4.75 (2 stemmen)



Crosspost met PHPFreakz.nl

Aangezien ik een redelijke vreemde structuur voor m'n klassen heb qua bestanden heb ik niet genoeg aan een standaard autoloader.
Ik had dus een scanner nodig die m'n include path doorloopt om een map te maken van klassenaam => bestand, en hier is het resultaat.

Het is gebaseerd op de tokenizer (wanneer niet), aangezien die beter kan bepalen dan ik waar een klassenaam staat, en het is ook nog eens verrekkes snel. :-)

Opmerkingen, commentaar, enzovoorts mag je achterlaten als reactie.

PS: Voorbeeld staat onderaan.

Code:
  1. <?php
  2. /**
  3.  * Klassenaamscanner inclusief voorbeeld
  4.  *
  5.  * @author Richard van Velzen
  6.  */
  7.  
  8. /**
  9.  * Scanner voor klasse- en interfacenamen in een bestand
  10.  *
  11.  * @param string $inputFile Bestand waarin namen gevonden moeten worden
  12.  * @return array Array van klasse- en interfacenamen
  13.  * @author Richard van Velzen
  14.  */
  15. function classNameScanner($inputFile) {
  16. if(!is_readable($inputFile)) {
  17. throw new InvalidArgumentException('Inputbestand is niet leesbaar');
  18. }
  19.  
  20. $foundNames = array();
  21. // haal alle tokens uit het bestand op
  22. $tokens = token_get_all(file_get_contents($inputFile));
  23.  
  24. for($i = 0, $length = count($tokens); $i !== $length; ++$i) {
  25. if(is_array($tokens[$i]) && ($tokens[$i][0] === T_CLASS || $tokens[$i][0] === T_INTERFACE)) {
  26. // begin te zoeken naar een T_STRING, en skip whitespace en comments
  27. for($j = $i + 1; $j !== $length; ++$j) {
  28. if(is_array($tokens[$j])) {
  29. if($tokens[$j][0] == T_STRING) {
  30. // we hebben een naam gevonden, gooi maar in de array
  31. $foundNames[] = $tokens[$j][1];
  32. continue 2;
  33. } elseif($tokens[$j][0] == T_WHITESPACE || $tokens[$j][0] == T_COMMENT || $tokens[$j][0] == T_DOC_COMMENT) {
  34. // whitespace en comments skippen we
  35. continue;
  36. }
  37. }
  38.  
  39. // hier klopt iets niet, hier hadden we nooit moeten komen
  40. // gooi een exception aangezien de syntax niet klopt en dit
  41. // bestand dus nooit geinclude kan worden
  42. throw new RuntimeException('Syntaxfout: geen naam gevonden na "class" of "interface"');
  43. }
  44. }
  45. }
  46.  
  47. return $foundNames;
  48. }
  49.  
  50. // stel je eigen includepath hier in
  51. set_include_path('framework' . PATH_SEPARATOR . get_include_path());
  52.  
  53. $classMap = array();
  54.  
  55. // we willen het hele includepath maar al te graag gebruiken :-)
  56. foreach(explode(PATH_SEPARATOR, get_include_path()) as $includePath) {
  57. // OS specifieke directory separator gebruiken
  58. $includePath = str_replace('\/', DIRECTORY_SEPARATOR, $includePath);
  59. if(substr($includePath, - 1, 1) !== DIRECTORY_SEPARATOR) {
  60. $includePath .= DIRECTORY_SEPARATOR;
  61. }
  62.  
  63. // haal alle PHP en INC files op
  64. $files = glob($includePath . '*.{php,inc}', GLOB_BRACE);
  65.  
  66. foreach($files as $file) {
  67. $file = realpath($file);
  68. foreach(classNameScanner($file) as $className) {
  69. $className = strtolower($className);
  70. if(!isset($classMap[$className])) {
  71. // alleen de eerste nemen, de rest zou nooit geinclude worden
  72. $classMap[$className] = $file;
  73. }
  74. }
  75. }
  76. }
  77.  
  78. print_r($classMap);
  79. ?>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (5)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.028s