Online Dokumentation

B

Bgag

Hallo Zusammen!
Ich möchte meine Klassen auf meiner Website vorstellen und zum Dowload anbieten. Dazu möchte ich die Klassen etwa so, wie auf php.net auflisten. Ich muss gestehen, dass ich durch PHPDoc und Doxygen nicht so ganz durchsteige bzw keine Funktion gefunden habe, die keine neuen Dokumentationen erstellt, sondern die vorhandenen auswertet und sie für eine Ausgabe mit HTML prepariert. Da bin ich dann auf Reflections gestoßen. Einfach schnell und übersichtlich. Doch leider habe ich das Problem, dass ich mit der Methode getDocComment nicht den gewünschten Kommentar zurückgegeben bekomme. Zudem möchte ich eigentlich nicht den kompletten Kommentar, sondern nur die dort enthaltenen Informationen in einem Array, um die gewünschten dann ausgeben zu können. Die Funktion habe ich nun schon geschrieben. Jedoch erhoffe ich mir von diesem Post, dass mir jemand beim erstellen einer solchen Seite helfen kann. Vielleicht gibt es ja auch eine bessere Alternative zu Reflections. Ein Anzeigebeispiel für den Momentanen Status habe ich mal hochgeladen. Bitte nicht von den beiden Arrays am Anfang verwirren lassen - mein Debgging. Das, was ihr hier seht, baut auf einer Klasse ExtReflect auf, die ihrerseits auf Reflections aufbaut. Nicht sehr sauber, aber was besseres ist mir leider nicht eingefallen. Wie ihr seht fehlt im Prinzip nur noch eine kurze Ausgabe allgemeiner Informationen der Klasse, wie eine kurze Beschreibung, das letzte Änderungsdatum, was man nun eben in den Hauptkommentar einer Klasse schreibt. Die Klasse habe ich angehängt. Hoffe mir kann einer helfen.
MfG, Andy

PHP:
<?php 
error_reporting(E_ALL);

/**
* Definde tabulators for easier formatting
* @author Andreas Wilhelm
* @package ExtReflect
*/
define( 'TAB' , '    ');

/**
* Comment used to start a phpdoc
* @author Andreas Wilhelm
* @package ExtReflect
*/
define( 'START_DOC' , '/**' );

/**
* Comment used to end a phpdoc
* @author Andreas Wilhelm
* @package ExtReflect
*/
define( 'END_DOC' , '*/' );

/**
* Comment used to indicate a tag of phpdoc
* @author Andreas Wilhelm
* @package ExtReflect
*/
define( 'TAG_DOC' , '@' );

/***
* Class ExtReflect
*
* The ExtReflect class enables documenting your classes
* using the php Reflection classes.
*
* @package ExtReflect
* @version 0.1
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Andreas Wilhelm
**/
class ExtReflect extends ReflectionClass
{
   /**
   * Constructor - Is called when the class is instanced
   *
   * @access: public
   * @param Str $class
   * @return NONE
   */
   public function __construct($class)
   {
      parent::__construct($class);
   }

   /**
   * file() - Retuns the filename
   *
   * @access: public
   * @return String
   */
   public function file()
   {      
      return basename( $this->getFileName() );
   }

   /**
   * getNotes() - Returns all parts of a comment.
   *
   * @access: public
   * @param Str $comment
   * @return Array
   */
   public function getNotes( $comment )
   {
      // split array into single lines
      $lines = explode( "\n" , $comment );
      
      // create note array
      $notes = array();
      
      foreach( $lines as $line )
      {
         // inside the comment block
         if ( strpos( trim( $line ) , START_DOC ) === 0 )
         {
            continue;
         }
         
         //outside the comment block
         elseif( strpos( trim( $line ) , END_DOC ) === 0 )
         {
            break;
         }
         
         // removing the tag doc from the line
         $line = substr( $line , strpos( $line , TAG_DOC ) );
               
         // get the name of the tag
         $item = substr( $line , 0 , strpos( $line , ' ' ) );
         
         // get the value of the tag
         $line = substr( $line , strpos( $line , ' ' ) + 1 );
               
         if ( strpos( trim( $line ) , '*' ) === 0 )
         {
            $line = substr( $line , strpos( $line , '*' ) + 1 );
         }
               
         $line = trim( $line );
         if ( !isset( $notes[ $item ] ) )
         {
            if ( !empty($line) )
            {
               $notes[ $item ] = $line;
               $notes[ $item ] .= "\n";
            }
         }
      }
      
      return( $notes );
   }

   /**
   * modifier() - Gets the class modifiers
   *
   * @access: public
   * @return String
   */
   public function modifier()
   {      
      return sprintf(
         "%s%s%s",
            $this->isAbstract() ? 'abstract ' : '',
            $this->isFinal() ? 'final ' : '',
            $this->isInterface() ? 'interface' : 'class '
      );
   }

   /**
   * parents() - Returns the parent class
   *
   * @access: public
   * @return String
   */
   public function parents()
   {
      if( count($this->getParentClass()) > 0 )
      {
         return @$this->getParentClass()->name;
      }
   }

   /**
   * interfaces() - Returns the interfaces implemented
   *
   * @access: public
   * @return Array
   */
   public function interfaces()
   {      
      // get interfaces
      $interfaces = array();
      
      foreach( $this->getInterfaces() as $value )
      {
         $interfaces[] = $value->name;
      }
      
      return $interfaces;
   }

   /**
   * constants() - Returns the constants
   *
   * @access: public
   * @return String
   */
   public function constants()
   {      
      // get constants
      if( count($this->getConstants()) > 0 )
      {
         $const = array();
         $i = 0;
         
         foreach ($this->getConstants() as $key => $value)
         {
            // fill array
            $const[$i]['name'] = $key;
            $const[$i]['value'] = $value;
         
            // count
            $i++;
         }
         
         return $const;
      }
   }

   /**
   * properties() - Gets the constants
   *
   * @access: public
   * @return String
   */
   public function properties()
   {      
      // get properties
      if( count($this->getProperties()) > 0 )
      {
         $props = array();
         
         foreach ($this->getProperties() as $key => $prop)
         {
            $props[$key]['comment'] = var_export($prop->getDocComment(), 1) . "\n";
            
            $props[$key]['modifier'] = sprintf(
               "%s%s%s%s",
               $prop->isPublic() ? 'public' : '',
               $prop->isPrivate() ? 'private' : '',
               $prop->isProtected() ? 'protected' : '',
               $prop->isStatic() ? ' static' : ''
            );
            
            $props[$key]['name'] = "$" . $prop->getName();
         }
         
         return $props;
      }
   }

   /**
   * methods() - Gets the methods
   *
   * @access: public
   * @return String
   */
   public function methods()
   {      
      // get methods
      if( count($this->getMethods()) > 0 )
      {
         $methods = array();
         
         foreach ($this->getMethods() as $key => $method)
         {   
            $methods[$key]['comment'] = var_export($method->getDocComment(), 1) . "\n";
            
            $methods[$key]['modifier'] = sprintf(
               "%s%s%s%s%s",
                  $method->isFinal() ? 'final' : '',
                  $method->isPublic() ? 'public' : '',
                  $method->isPrivate() ? 'private' : '',
                  $method->isProtected() ? 'protected' : '',
                  $method->isStatic() ? ' static' : ''
            );
            
            $methods[$key]['name'] = $method->getName();
            $params = '';
      
            foreach ($method->getParameters() as $k => $param)
            {
                $params .= sprintf(
                  "%s%s$%s%s",
                  ( $k > 0 ) ? ',' : '',
                  $param->isOptional() ? '[' : '',
                  $param->getName(),
                  $param->isOptional() ? ']' : ''
               );
            }
            
            $methods[$key]['params'] = split('[,.-]', $params);
         }
            
         return $methods;
      }
   }

   /**
   * __toString() - Returns structur of a class
   *
   * @access: public
   * @return String
   */
   public function __toString()
   {
      // list constants
      if( $this->getDocComment() === true )
      {
         $code = var_export($this->getDocComment(), 1) . "\n";
      }
      
      else
      {
         $code = '';
      }
      
      $code .= $this->modifier();
      $code .= $this->getName() . " ";
      
      // list constants
      if( count( $this->parents() ) > 0 )
      {
         $code .= "extends " . $this->parents();
      }
      
      // print out interfaces
      if( count( $this->interfaces() ) > 0 )
      {
         $code .= ' implements ' . implode(', ', $this->interfaces());
      }
      
      // complete code
      $code .= "\n{\n";
      
      // list constants
      if( count( $this->constants() ) > 0 )
      {
         $code .= TAB . "/* Constants */\n";   
         foreach( $this->constants() as $const )
         {
            $code .= sprintf(
                  TAB . "const %s = %s;\n",
                  $const['name'],
                  $const['value']
               );
         }
         
         $code .= "\n";
      }
      
      // list properties
      if( count( $this->properties() ) > 0 )
      {
         $code .= TAB . "/* Properties */\n";
         foreach( $this->properties() as $prop )
         {
            $code .= sprintf(
                  TAB . "%s %s\n",
                  $prop['modifier'],
                  $prop['name']
               );
         }
         
         $code .= "\n";
      }
      
      // list methods
      if( count( $this->methods() ) > 0 )
      {
         $code .= TAB . "/* Methods */\n";
         foreach($this->methods() as $method)
         {
            $code .= sprintf(
                  TAB . "%s %s(%s)\n",
                  $method['modifier'],
                  $method['name'],
                  implode(', ', $method['params'])
               );
         }
      }
      
      // finish code
      $code .= "}";
      
      return $code;
   }      
}

try
{
   // include class to document
   include_once('Smtp.php');

   // instance ExtReflect class
   $doc = new ExtReflect('Smtp');
   
   highlight_string("<?\n\n".$doc."\n\n?>");
}

catch(Exception $e)
{
   echo '<b>' . $e->getLine() . ':</b> ' . $e->getMessage();
}
?>
 
Zuletzt bearbeitet von einem Moderator:
Zurück