2010-03-27 10 views
14

Me gustaría construir algunos sitios de documentación a pequeña escala pero muy personalizados para algunos proyectos. PhpDocumentor es bastante bueno pero es muy pesado. Pensé en intentar modificar las plantillas para eso, pero después de pasar solo un par de minutos investigando, decidí que sería demasiado trabajo.¿Hay alguna herramienta de análisis PHP DocBlock disponible?

Idealmente, me gustaría ver algo a lo que pudiera pasar un montón de archivos y hacer que devuelva todos los archivos, clases, propiedades y métodos, junto con sus metadatos, para poder construir algunos simples plantillas basadas en los datos.

¿Hay algún proyecto de analizador sintáctico de DocBlock que me ayude en esta tarea, o estoy atascado reinventando esa rueda?

Respuesta

20

Puede hacer esto fácilmente a sí mismo con el Reflection API:

/** 
* This is an Example class 
*/ 
class Example 
{ 
    /** 
    * This is an example function 
    */ 
    public function fn() 
    { 
     // void 
    } 
} 

$reflector = new ReflectionClass('Example'); 

// to get the Class DocBlock 
echo $reflector->getDocComment() 

// to get the Method DocBlock 
$reflector->getMethod('fn')->getDocComment(); 

ver este tutorial: http://www.phpriot.com/articles/reflection-api

También hay un PEAR package que puede analizar docblocks.

+0

Para usar la reflexión, ¿no tiene que cargar de alguna manera el script PHP que contiene la clase de interés? ¿Cómo se logra eso, para una larga lista arbitraria de scripts PHP? –

+0

@Ira Vea el ejemplo en http://php.net/manual/en/reflectionclass.getdoccomment.php - si quiere analizar archivos para clases, puede usar http://github.com/theseer/Autoload/blob /master/src/classfinder.php y para iterar sobre directorios puede usar http://php.net/manual/en/class.recursivedirectoryiterator.php – Gordon

-2

Parece que desea un analizador de PHP que pueda exportar detalles particulares de lo que se ha analizado.

Nuestro Semantic Designs PHP Front End proporciona un analizador PHP 4/5 completo (a partir de 2016 incluye PHP 7). Analiza el código fuente de PHP, crea árboles de sintaxis abstracta, sellando cada nodo con información de ubicación precisa y los pone a disposición para su uso posterior. Una cosa general que puede hacer es imprimir cualquier subárbol como el texto original.

En su caso, desea escanear los árboles, buscar las clases/métodos/propiedades (como nodos de árbol) e imprimir su texto de origen, junto con la información de ubicación. Creo que eso entregaría exactamente lo que quieres.

+2

Ira Baxter, esto es como el quinto anuncio de su producto comercial que he encontrado mientras intentas resolver un problema relacionado con PHP DocBlocks. En ninguno de estos anuncios, explícitamente, de manera textual, divulgó su afiliación con el vendedor del producto anunciado. –

+0

Usted los llama "anuncios", en una objeción aparente a las soluciones comerciales a los problemas. Esto documenta una solución al problema OP propuesto, y eso hace que esta sea una respuesta legítima. Hubo objeciones de que algunas de mis respuestas no mostraban claramente mi afiliación, y esas objeciones eran ciertas ocasionalmente al principio de la vida de SO, aunque mi biografía es bastante explícita sobre el hecho de que * soy * el proveedor, no solo asociado. Esta es una de las primeras respuestas. .... –

+0

... El problema de indicar afiliación se resolvió hace mucho tiempo; si insistes, puedes buscar la discusión en Meta. La resolución fue permitir el uso de la palabra "nuestro" para indicar tal afiliación. Esta respuesta en particular se escribió antes de que existiera una política, por lo que no siguió la política. Estoy editando la respuesta para seguir la política ahora. Si sabe de otros que no lo hacen, envíeme una lista por correo electrónico (o comentarios aquí) y los revisaré en consecuencia. Desde la resolución, he seguido la política escrupulosamente. –

5

Solo para actualizar las respuestas. Es posible que también desee consultar el proyecto phpDocumentor2. Creo que es un analizador PHP DocBlock que se puede extraer fácilmente como una solución independiente.

+2

DocBlox se ha fusionado con phpDocumentor para convertirse en [phpDocumentor2] (http://github.com/phpDocumentor/phpDocumentor2). – quantme

+0

Aunque estoy de acuerdo en que phpDocumentor es bueno, el OP explícitamente solicita algo que ** no es ** phpDocumentor – icc97

6

En caso de que alguien necesita una expresión regular (xdazzsuggested a probar esto y student310 comentó que trabaja para ella/sus necesidades)

if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ 
    $result = array_combine($matches[1], $matches[2]); 
} 

Ejemplo (Demo):

<?php 
$str =' 
/**  
* @param integer $int An integer 
* @return boolean 
*/ 
'; 
if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ 
    $result = array_combine($matches[1], $matches[2]); 
} 

var_dump($result); 
3

Como furgas pointed out, llevo años usando phpDocumentor como un proyecto independiente y funciona bien.

<?php 
$class = new ReflectionClass('MyClass'); 
$phpdoc = new \phpDocumentor\Reflection\DocBlock($class); 

var_dump($phpdoc->getShortDescription()); 
var_dump($phpdoc->getLongDescription()->getContents()); 
var_dump($phpdoc->getTags()); 
var_dump($phpdoc->hasTag('author')); 
var_dump($phpdoc->hasTag('copyright')); 
Cuestiones relacionadas