Estoy tratando de documentar mi biblioteca PHP con doxygen, pero no puedo configurarla para que reconozca el uso correcto de la función miembro de mi clase, usando la palabra clave "self". Por ejemplo el siguiente código:
Class myclass{ public static function myfunc1(){ return 10; } public static function myfunc2(){ return self::myfunc1(); } }no está correctamente documentado. Doxygen asigna las dos funciones, pero cuando se refiere a la llamada interna o externa a estas funciones, no tiene en cuenta el myfunc1 llamado por myfunc2.
Mi solución en este momento es cambiar el código de la siguiente manera:
Class myclass{ public static function myfunc1(){ return 10; } public static function myfunc2(){ return myclass::myfunc1(); } }En este caso, doxygen se refiere correctamente al uso de myfunc1 relacionado con myfunc2. Por supuesto que no me gusta mucho esta solución. ¿Cómo puedo solucionar este problema? Muchísimas gracias
Doxygen proporciona la opción de filtro de entrada, que nos permite cambiar el código fuente en el momento de la creación de la documentación. Por ejemplo, nos da la capacidad de interceptar el código y cambiar el código self::myfunc1 a myclass::myfunc1 al vuelo, lo que Doxygen entiende. No cambia el código fuente real de ninguna manera.
Creé un filtro basado en el código de Doxygen PHP Filters con algunas modificaciones, que pueden hacer los cambios por usted.
Cree un archivo /ruta/a/selfFilter.php y coloque el código dentro:
<?php //Create file /path/to/selfFilter.php $source = file_get_contents($argv[1]); $tokens = token_get_all($source); $classes = array(); foreach($tokens as $key => $token) { if($token[0] == T_CLASS) $classes[] = $tokens[$key+2][1]; } if(!empty($classes)) { list($source, $tail) = explode('class ' . $classes[0], $source, 2); $class_code = ''; for($i = 1; $i < count($classes); $i++) { list($class_code, $tail) = explode('class ' . $classes[$i], $tail, 2); $class_code = preg_replace('#\bself::#', $classes[$i-1].'::', $class_code); $source .= 'class ' . $classes[$i-1] . $class_code; } $class_code = preg_replace('#\bself::#', $classes[count($classes)-1].'::', $tail); $source .= 'class ' . $classes[count($classes)-1] . $class_code; } echo $source;Actualice las siguientes opciones en su archivo de configuración de doxygen.
INPUT_FILTER = "php /path/to/selfFilter.php" FILTER_PATTERNS = FILTER_SOURCE_FILES = YES FILTER_SOURCE_PATTERNS = Asegúrese de que /path/to/selfFilter.php sea ejecutable y que php esté disponible en la ruta; de lo contrario, use la ruta completa de php
INPUT_FILTER = /usr/bin/php /path/to/selfFilter.phpSi ejecuta el Doxygen ahora, debería funcionar. Por favor, hágamelo saber si tiene algún problema.
Nota: La palabra clave 'clase' debe definirse en minúsculas para que funcionen los filtros anteriores.