begin process at 2012 05 27 17:56:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] CLASSE DE DOCUMENTATION DE CLASSES ET DE FONCTIONS

[PHP5] CLASSE DE DOCUMENTATION DE CLASSES ET DE FONCTIONS


 Information sur la source

Note :
9,5 / 10 - par 6 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :documentation, classe, objets, réflexion, api Niveau :Initié Date de création :08/02/2006 Date de mise à jour :01/03/2006 15:01:45 Vu / téléchargé :8 073 / 505

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (43)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
CREDITS

A very special thanks to Bastian Gorke for his contribution, he added the German translation!
Thanks a lot, Bastian! :-)

Un grand merci à Bastian Gorke pour sa contribution, il a ajouté la traduction en allemand!
Merci beaucoup, Bastian! :-)


README

Ce script est un script de documentation de classes et de fonctions.
L'utilisation est très simple :

CLASSES :
Leur analyse fonctionne par package.
Un formulaire sert à créer un package.
Un autre sert à uploader des classes dans un package. Si vous avez des classes héritant d'autres classes,
vous devez uploader ces classes parentes dans le package.
Un 3ème forumaire, enfin, sert à analyser le package complet.
Une documentation sera créée, avec un index propre au package, contenant le diagramme d'héritages du package.


FONCTIONS :
Un formulaire sert à uploader le fichier de fonction, un autre à analyser les fichiers uploadés.
Seules les fonctions 'user_defined' seront analysées.


Une collection de fichiers html sont alors créés, facilement transportable dans un autre script
donc on veut documenter les classes ou/et fonctions.

A noter que l'on peut analyser n'importe quelle classe, y compris une classe interne.

La documentation est localisée. Pour le moment, sont supportés l'anglais, le français et l'allemand.
Il est très facile de créer une traduction : il suffit de rajouter une langue dans les fichiers xml
qui se trouvent dans le répertoire 'locales'.

J'ai mis dans le répertoire css/ différentes css, pour montrer que le design est très facilement
modifable. Il suffit pour cela de nommer la css voulue "maindoc.css".

index.php passe par l'interface utilisateur
index2.php montre comment ne pas passer par cette interface (il faut au prélable mettre les classes
à documenter dans le répertoire 'classes')

REPERTOIRES :

class/ => contient les classes faisant fonctionner le script : odocclass.cls.php, odocfunc.cls.php, olocale.cls.php et ohtml.cls.php
classes/ => contient les classes à analyser
fonctions/ => contient les fichiers de fonctions à analyser
css/ => contient la css de la documentation
docs/"langue"/"package"/classes/ et docs/"langue"/fonctions/ => lorsque une classe ou une fonction est analysée, ce répertoire est créé, ainsi qu'un sous-répertoire
du nom de la classe/fonction étudiée. Dans ce sous-répertoire se trouvent les fichiers
html de la documentation
locales/ => contient les fichiers xml de localisation



This script is a classes and functions documentation tool.
It's easy to use :

CLASSES :
Their analysis is based on packages.
A first form is used to create a package name.
A second one is used to upload classes in the package. If you have inherited classes, you MUST upload these
parent classes in the package, too.
A thirs form, finally, is used to analyze a chosen package.
The documentation is then created, with an index page for the package, displaying a diagram for the classes hierarchy.


FONCTIONS :
A first form is used to upload the functions files, and a second one to analyze the chosen file.


HTML files are then created, you can easily move wherever you want to give access to the documentation.

The documentation tool is localized : up to now, only English, French and German are supported.
But it is very easy to create a new language : you just have to translate all the xml files located in the folder 'locales'.
Then, just add the nez language button in the file 'localize.form.html'.

I have put in the 'css' folder various css. The one used will be the one named 'maindoc.css'.
You can create yours quite easily.

FOLDERS :
class/ => here are the tool classes : odocclass.cls.php, odocfunc.cls.php, olocale.cls.php and ohtml.cls.php
classes/ => here are the uploaded classes to be analyzed
fonctions/ => here are the uploaded functions files to be analized
css/ => here are the css files (maindoc.css being the one currently used)
docs/'language_name'/"package_name"/classes and docs/'language_name'/fonctions => here are the html documentation files
locales/ => here are the xml translation files

Source

  • <?php
  • /**
  • * CLASS odocclass
  • * classe de documentation de classes
  • * @auteur : johan <barbier_johan@hotmail.com>
  • * @version : 2.4
  • * @date : 2006/02/10
  • *
  • * free to use, modify, please just tell me if you make any changes :-)
  • */
  • class odocclass extends ReflectionClass {
  • /**
  • * propriété qui contiendra l'objet olocale pour la localisation
  • */
  • private $oloc;
  • /**
  • * tableau des propriétés générales
  • */
  • private $aGeneral = array ();
  • /**
  • * tableau des propriétés des méthodes
  • */
  • private $aMethods = array ();
  • /**
  • * tableau des propriétés des propriétés
  • */
  • private $aProperties = array ();
  • /**
  • /**
  • * tableau buffer des lignes des fichiers codes
  • */
  • private $fileBuf = array ();
  • /**
  • * tableau des classes et de leurs enfants d'un package
  • */
  • private $aChild = array ();
  • /**
  • * chaîne qui contiendra le nom du package
  • */
  • private $package = '';
  • /**
  • * constructeur
  • * @Params string className : nom de la classe à analyser
  • * @Params string child : nom de la classe fille appelante, héritant de la classe courante
  • */
  • public function __construct ($package, array $aArbo) {
  • $this -> oloc = new olocale ($_SESSION['locale']);
  • $this -> package = $package;
  • $this -> aArbo = $aArbo;
  • foreach ($this -> aArbo as $className => $dump) {
  • $this -> aChild[$className]['children'] = array ();
  • foreach ($aArbo as $clef => $val) {
  • if ($className === $val['parent']) {
  • $this -> aChild[$className]['children'][] = $clef;
  • }
  • }
  • parent::__construct ($className);
  • $this -> aGeneral = $this -> getGeneral ();
  • $this -> aMethods = $this -> getaMethods ();
  • $this -> aProperties = $this -> getaProperties ();
  • if (empty ($this -> aGeneral['classe'])) {
  • if (empty ($this -> aArbo[$className]['parent'])) {
  • $parent = '';
  • } else {
  • $parent = $this -> aGeneral['classe'] = $this -> aArbo[$className]['parent'];
  • $this -> aGeneral['classeType'] = 'interface';
  • }
  • } else {
  • $parent = $this -> aGeneral['classe'];
  • }
  • $this -> aChild[$className]['parent'] = $parent;
  • $this -> buildHtmlClass ();
  • }
  • $ohtml = new ohtml ($this -> package);
  • $ohtml -> setIndexPack ($this -> aChild);
  • }
  • /**
  • * méthode privée buildHtmlClass
  • * appelle l'objet ohtml pour construire effectivement la doc pour les classes
  • */
  • private function buildHtmlClass () {
  • $ohtml = new ohtml ($this -> package);
  • $ohtml -> header ();
  • $ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties);
  • $ohtml -> setContentGeneral ($this -> aGeneral);
  • $ohtml -> footer ();
  • $ohtml -> toFileClass ($this -> aGeneral['name'], $this -> aGeneral['name']);
  • $ohtml -> freeHtml ();
  • foreach ($this -> aMethods as $clef => $val) {
  • $ohtml -> header ();
  • $ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties, $clef);
  • $ohtml -> setContentMethods ($val);
  • $ohtml -> footer ();
  • $ohtml -> toFileMethProps ($this -> aGeneral['name'], $clef);
  • $ohtml -> freeHtml ();
  • }
  • foreach ($this -> aProperties as $clef => $val) {
  • $ohtml -> header ();
  • $ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties, $clef);
  • $ohtml -> setContentProperties ($val);
  • $ohtml -> footer ();
  • $ohtml -> toFileMethProps ($this -> aGeneral['name'], $clef);
  • $ohtml -> freeHtml ();
  • }
  • $ohtml -> setIndex ();
  • }
  • /**
  • * méthode privée getCode
  • * sert à récupérer le code dans un fichier, d'une ligne de départ jusqu'à 1 ligne d'arrivée
  • * @Return : string code
  • */
  • private function getCode ($filename, $start, $end) {
  • $code = '';
  • if (!empty ($filename)) {
  • if (!array_key_exists ($filename, $this -> fileBuf)) {
  • $this -> fileBuf[$filename] = file ($filename);
  • }
  • for ($i = $start - 1; $i <= $end; $i++) {
  • $code .= $this -> fileBuf[$filename][$i];
  • }
  • }
  • return $code;
  • }
  • /**
  • * méthode privée getGeneral
  • * sert à remplir le tableau des propriétés générales de la classe à analyser
  • * @Return : array aTmp
  • */
  • private function getGeneral () {
  • $aTmp['name'] = $this -> getName ();
  • $aTmp['type'] = $this -> isInternal () ? 'internal' : 'user-defined';
  • $aTmp['abstract'] = $this -> isAbstract () ? 'abstract' : '';
  • $aTmp['interface'] = $this -> isInterface () ? 'interface' : 'class';
  • $aTmp['file'] = $this -> getFileName();
  • $aTmp['startline'] = $this -> getStartLine();
  • $aTmp['endline'] = $this -> getEndLine();
  • $aTmp['code'] = utf8_encode ($this -> getCode ($aTmp['file'], $aTmp['startline'], $aTmp['endline']));
  • $aTmp['final'] = $this -> isFinal () ? ' final' : '';
  • $aTmp['comments'] = method_exists ($this, 'getDocComment')?utf8_encode (htmlentities($this -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version');
  • $aTmp['total methods'] = count ($this -> getMethods ());
  • $aTmp['total properties'] = count ($this -> getProperties ());
  • $parent = $this -> getParentClass();
  • if (is_object ($parent)) {
  • $name = $parent -> getName ();
  • $parentType = $parent -> isInterface ()?'interface':'class';
  • } else {
  • $name = '';
  • $parentType = '';
  • }
  • $aTmp['classe'] = $name;
  • $aTmp['classeType'] = $parentType;
  • if (!empty ($aTmp)) {
  • return $aTmp;
  • } else {
  • return array ();
  • }
  • }
  • /**
  • * méthode privée getMethods
  • * sert à remplir le tableau des propriétés des méthodes de la classe à analyser
  • * @Return : array aTmp
  • */
  • private function getaMethods () {
  • foreach ($this -> getMethods () as $val) {
  • $aTmp[$val -> getName ()] = array (
  • 'name' => $val->getName (),
  • 'type' => $val->isInternal() ? 'internal' : 'user-defined',
  • 'abstract' => $val->isAbstract() ? ' abstract' : '',
  • 'final' => $val->isFinal() ? ' final' : '',
  • 'public' => $val->isPublic() ? ' public' : '',
  • 'private' => $val->isPrivate() ? ' private' : '',
  • 'protected' => $val->isProtected() ? ' protected' : '',
  • 'static' => $val->isStatic() ? ' static' : '',
  • 'constructor' => $val->isConstructor()?'constructor':($val -> isDestructor()?'destructor':'regular method'),
  • 'file' => $val->getFileName(),
  • 'startline' => $val->getStartLine(),
  • 'endline' => $val->getEndline(),
  • 'code' => utf8_encode ($this -> getCode ($val->getFileName(), $val->getStartLine(), $val->getEndline())),
  • 'modifiers' => $val->getModifiers(). ' => '.implode(' ', Reflection::getModifierNames($val->getModifiers())),
  • 'comments' => method_exists ($val, 'getDocComment')?utf8_encode (htmlentities($val -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version'),
  • 'statics' => $val->getStaticVariables(),
  • 'classe' => $val -> getDeclaringClass() -> getName (),
  • 'parameters' => $this -> getaParameters ($val -> getParameters())
  • );
  • $aTmp[$val -> getName ()]['returns'] = $this -> getReturns ($aTmp[$val -> getName ()]['comments']);
  • $aTmp[$val -> getName ()]['params'] = $this -> getParams ($aTmp[$val -> getName ()]['comments']);
  • }
  • if (!empty ($aTmp)) {
  • return $aTmp;
  • } else {
  • return array ();
  • }
  • }
  • /**
  • * méthode privée getReturns
  • * sert à récupérer le code pour la/les valeur/s de retour de la méthode, si elle est documentée
  • * @Param string comments : contient une chaîne avec les commentaires de la méthode
  • * @Return array aTmp : contient un tableau avec les retours possibles
  • */
  • private function getReturns ($comments) {
  • preg_match_all ('@\@return[s]?+(.+)@im', $comments, $res);
  • $aTmp = $res[1];
  • return (array)$aTmp;
  • }
  • /**
  • * méthode privée getParams
  • * sert à récupérer le code pour le/les paramètre/s de la méthode, si elle est documentée
  • * @Param string comments : contient une chaîne avec les commentaires de la méthode
  • * @Return array aTmp : contient un tableau avec les paramètres possibles
  • */
  • private function getParams ($comments) {
  • preg_match_all ('@\@param[s]?+(.+)@im', $comments, $res);
  • $aTmp = $res[1];
  • return (array)$aTmp;
  • }
  • /**
  • * méthode privée getaParameters
  • * sert à remplir le tableau des paramètres des méthodes
  • * @Return : array aTmp
  • */
  • private function getaParameters ($aArgs) {
  • $aTmp = array ();
  • if (!empty ($aArgs)) {
  • foreach ($aArgs as $val) {
  • $isArray = true === method_exists ($val, 'isArray')?$val -> isArray():false;
  • $aTmp[$val -> getName ()] = array (
  • 'name' => $val -> getName (),
  • 'reference' => $val -> isPassedByReference()?'&':'',
  • 'array' => ($isArray)?'array':'',
  • 'optional' => $val -> isOptional()?$this -> oloc -> getMsg ('doc', 'doc_optional'):$this -> oloc -> getMsg ('doc', 'doc_mandatory'),
  • 'default' => ($val -> isDefaultValueAvailable())?$val -> getDefaultValue():''
  • );
  • }
  • }
  • if (!empty ($aTmp)) {
  • return $aTmp;
  • } else {
  • return array ();
  • }
  • }
  • /**
  • * méthode privée getGeneral
  • * sert à remplir le tableau des propriétés des propriétés de la classe à analyser
  • * @Return : array aTmp
  • */
  • private function getaProperties () {
  • foreach ($this -> getProperties () as $val) {
  • $aTmp[$val -> getName ()] = array (
  • 'name' => $val->getName (),
  • 'public' => $val -> isPublic()?'public':'',
  • 'private' => $val -> isPrivate()?'private':'',
  • 'protected' => $val -> isProtected()?'protected':'',
  • 'static' => $val -> isStatic()?'static':'',
  • 'default' => $val -> isDefault()?$this -> oloc -> getMsg ('doc', 'doc_yes'):$this -> oloc -> getMsg ('doc', 'doc_no'),
  • 'modifiers' => $val->getModifiers(). ' => '.implode(' ', Reflection::getModifierNames($val->getModifiers())),
  • 'comments' => method_exists ($val, 'getDocComment')?utf8_encode (htmlentities ($val -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version'),
  • 'classe' => $val -> getDeclaringClass() -> getName (),
  • 'code' => utf8_encode ($this -> getPropsCode ($val -> getDeclaringClass() -> getFileName (), $val -> getName())),
  • );
  • $aTmp[$val -> getName ()]['defaultvalue'] = ltrim (strstr ($aTmp[$val -> getName ()]['code'], '='), '=');
  • }
  • if (!empty ($aTmp)) {
  • return $aTmp;
  • } else {
  • return array ();
  • }
  • }
  • /**
  • * méthode privée getPropsCode
  • * sert à récupérer la portin de code où est définie une propriété donnée
  • * @Params string fileName : nom du fichier où est définie la propriété
  • * @Params string name : nom de la propriété
  • * @Return : string code en cas de succès, false en cas d'échec
  • */
  • private function getPropsCode ($fileName, $name) {
  • if (!empty ($fileName)) {
  • if (!array_key_exists ($fileName, $this -> fileBuf)) {
  • $this -> fileBuf[$fileName] = file ($fileName);
  • }
  • $cpt = count ($this -> fileBuf[$fileName]);
  • for ($i = 0; $i < $cpt; $i++) {
  • if (false !== strpos ($this -> fileBuf[$fileName][$i], $name)) {
  • $start = $i;
  • break;
  • }
  • }
  • if (isset ($start)) {
  • for ($i = $start; $i < $cpt; $i++) {
  • if (false !== strpos ($this -> fileBuf[$fileName][$i], ';')) {
  • $end = $i;
  • break;
  • }
  • }
  • }
  • if (isset ($end) && isset ($start)) {
  • $code = '';
  • for ($i = $start; $i <= $end; $i++) {
  • $code .= $this -> fileBuf[$fileName][$i];
  • }
  • return $code;
  • }
  • }
  • return false;
  • }
  • }
  • ?>
<?php
/**
* CLASS odocclass
* classe de documentation de classes
* @auteur : johan <barbier_johan@hotmail.com>
* @version : 2.4
* @date : 2006/02/10
*
* free to use, modify, please just tell me if you make any changes :-)
*/
class odocclass extends ReflectionClass {

	/**
	* propriété qui contiendra l'objet olocale pour la localisation
	*/
	private $oloc;
	/**
	* tableau des propriétés générales
	*/
	private $aGeneral = array ();
	/**
	* tableau des propriétés des méthodes
	*/
	private $aMethods = array ();
	/**
	* tableau des propriétés des propriétés
	*/
	private $aProperties = array ();
	/**

	/**
	* tableau buffer des lignes des fichiers codes
	*/
	private $fileBuf = array ();

	/**
	* tableau des classes et de leurs enfants d'un package
	*/
	private $aChild = array ();

	/**
	* chaîne qui contiendra le nom du package
	*/
	private $package = '';

	/**
	* constructeur
	* @Params string className : nom de la classe à analyser
	* @Params string child : nom de la classe fille appelante, héritant de la classe courante
	*/
	public function __construct ($package, array $aArbo) {
		$this -> oloc = new olocale ($_SESSION['locale']);
		$this -> package = $package;
		$this -> aArbo = $aArbo;
		foreach ($this -> aArbo as $className => $dump) {
			$this -> aChild[$className]['children'] = array ();
			foreach ($aArbo as $clef => $val) {
				if ($className === $val['parent']) {
					$this -> aChild[$className]['children'][] = $clef;
				}
			}
			parent::__construct ($className);
			$this -> aGeneral = $this -> getGeneral ();
			$this -> aMethods = $this -> getaMethods ();
			$this -> aProperties = $this -> getaProperties ();
			if (empty ($this -> aGeneral['classe'])) {
				if (empty ($this -> aArbo[$className]['parent'])) {
					$parent = '';
				} else {
					$parent = $this -> aGeneral['classe'] = $this -> aArbo[$className]['parent'];
					$this -> aGeneral['classeType'] = 'interface';
				}
			} else {
				$parent = $this -> aGeneral['classe'];
			}
			$this -> aChild[$className]['parent'] = $parent;
			$this -> buildHtmlClass ();
		}
		$ohtml = new ohtml ($this -> package);
		$ohtml -> setIndexPack ($this -> aChild);
	}

	/**
	* méthode privée buildHtmlClass
	* appelle l'objet ohtml pour construire effectivement la doc pour les classes
	*/
	private function buildHtmlClass () {
		$ohtml = new ohtml ($this -> package);
		$ohtml -> header ();
		$ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties);
		$ohtml -> setContentGeneral ($this -> aGeneral);
		$ohtml -> footer ();
		$ohtml -> toFileClass ($this -> aGeneral['name'], $this -> aGeneral['name']);
		$ohtml -> freeHtml ();
		foreach ($this -> aMethods as $clef => $val) {
			$ohtml -> header ();
			$ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties, $clef);
			$ohtml -> setContentMethods ($val);
			$ohtml -> footer ();
			$ohtml -> toFileMethProps ($this -> aGeneral['name'], $clef);
			$ohtml -> freeHtml ();
		}
		foreach ($this -> aProperties as $clef => $val) {
			$ohtml -> header ();
			$ohtml -> setMenu ($this -> aGeneral['name'], $this -> aGeneral['classe'], $this -> aChild[$this -> aGeneral['name']]['children'], $this -> aMethods, $this -> aProperties, $clef);
			$ohtml -> setContentProperties ($val);
			$ohtml -> footer ();
			$ohtml -> toFileMethProps ($this -> aGeneral['name'], $clef);
			$ohtml -> freeHtml ();
		}
		$ohtml -> setIndex ();
	}

	/**
	* méthode privée getCode
	* sert à récupérer le code dans un fichier, d'une ligne de départ jusqu'à 1 ligne d'arrivée
	* @Return : string code
	*/

	private function getCode ($filename, $start, $end) {
		$code = '';
		if (!empty ($filename)) {
			if (!array_key_exists ($filename, $this -> fileBuf)) {
				$this -> fileBuf[$filename] = file ($filename);
			}
			for ($i = $start - 1; $i <= $end; $i++) {
				$code .= $this -> fileBuf[$filename][$i];
			}
		}
		return $code;
	}

	/**
	* méthode privée getGeneral
	* sert à remplir le tableau des propriétés générales de la classe à analyser
	* @Return : array aTmp
	*/
	private function getGeneral () {
		$aTmp['name'] = $this -> getName ();
		$aTmp['type'] = $this ->  isInternal () ? 'internal' : 'user-defined';
		$aTmp['abstract'] = $this -> isAbstract () ? 'abstract' : '';
		$aTmp['interface'] = $this -> isInterface () ? 'interface' : 'class';
		$aTmp['file'] = $this -> getFileName();
		$aTmp['startline'] = $this -> getStartLine();
		$aTmp['endline'] = $this -> getEndLine();
		$aTmp['code'] = utf8_encode ($this -> getCode ($aTmp['file'], $aTmp['startline'], $aTmp['endline']));
		$aTmp['final'] =  $this -> isFinal () ? ' final' : '';
		$aTmp['comments'] = method_exists ($this, 'getDocComment')?utf8_encode (htmlentities($this -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version');
		$aTmp['total methods'] = count ($this -> getMethods ());
		$aTmp['total properties'] = count ($this -> getProperties ());
		$parent = $this -> getParentClass();
		if (is_object ($parent)) {
			$name = $parent -> getName ();
			$parentType = $parent -> isInterface ()?'interface':'class';
		} else {
			$name = '';
			$parentType = '';
		}
		$aTmp['classe'] = $name;
		$aTmp['classeType'] = $parentType;

		if (!empty ($aTmp)) {
			return $aTmp;
		} else {
			return array ();
		}
	}

	/**
	* méthode privée getMethods
	* sert à remplir le tableau des propriétés des méthodes de la classe à analyser
	* @Return : array aTmp
	*/
	private function getaMethods () {
		foreach ($this -> getMethods () as $val) {
			$aTmp[$val -> getName ()] = array (
				  'name' =>  $val->getName (),
				  'type' =>  $val->isInternal() ? 'internal' : 'user-defined',
				   'abstract' => $val->isAbstract() ? ' abstract' : '',
				   'final' => $val->isFinal() ? ' final' : '',
				   'public' => $val->isPublic() ? ' public' : '',
				   'private' => $val->isPrivate() ? ' private' : '',
				   'protected' => $val->isProtected() ? ' protected' : '',
				   'static' => $val->isStatic() ? ' static' : '',
				   'constructor' => $val->isConstructor()?'constructor':($val -> isDestructor()?'destructor':'regular method'),
				   'file' => $val->getFileName(),
				   'startline' => $val->getStartLine(),
				   'endline' => $val->getEndline(),
				   'code' => utf8_encode ($this -> getCode ($val->getFileName(), $val->getStartLine(), $val->getEndline())),
 				   'modifiers' => $val->getModifiers(). ' => '.implode(' ', Reflection::getModifierNames($val->getModifiers())),
 				   'comments' => method_exists ($val, 'getDocComment')?utf8_encode (htmlentities($val -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version'),
 				   'statics' => $val->getStaticVariables(),
 				   'classe' => $val -> getDeclaringClass() -> getName (),
 				   'parameters' => $this -> getaParameters ($val -> getParameters())
				);
			$aTmp[$val -> getName ()]['returns'] = $this -> getReturns ($aTmp[$val -> getName ()]['comments']);
			$aTmp[$val -> getName ()]['params'] = $this -> getParams ($aTmp[$val -> getName ()]['comments']);
		}
		if (!empty ($aTmp)) {
			return $aTmp;
		} else {
			return array ();
		}
	}

	/**
	* méthode privée getReturns
	* sert à récupérer le code pour la/les valeur/s de retour de la méthode, si elle est documentée
	* @Param string comments : contient une chaîne avec les commentaires de la méthode
	* @Return array aTmp : contient un tableau avec les retours possibles
	*/
	private function getReturns ($comments) {
		preg_match_all ('@\@return[s]?+(.+)@im', $comments, $res);
		$aTmp = $res[1];
		return (array)$aTmp;
	}

	/**
	* méthode privée getParams
	* sert à récupérer le code pour le/les paramètre/s de la méthode, si elle est documentée
	* @Param string comments : contient une chaîne avec les commentaires de la méthode
	* @Return array aTmp : contient un tableau avec les paramètres possibles
	*/
	private function getParams ($comments) {
		preg_match_all ('@\@param[s]?+(.+)@im', $comments, $res);
		$aTmp = $res[1];
		return (array)$aTmp;
	}

	/**
	* méthode privée getaParameters
	* sert à remplir le tableau des paramètres des méthodes
	* @Return : array aTmp
	*/
	private function getaParameters ($aArgs) {
		$aTmp = array ();
		if (!empty ($aArgs)) {
			foreach ($aArgs as $val) {
				$isArray = true === method_exists ($val, 'isArray')?$val -> isArray():false;
				$aTmp[$val -> getName ()] = array (
					'name' => $val -> getName (),
					'reference' => $val -> isPassedByReference()?'&':'',
					'array' => ($isArray)?'array':'',
					'optional' => $val -> isOptional()?$this -> oloc -> getMsg ('doc', 'doc_optional'):$this -> oloc -> getMsg ('doc', 'doc_mandatory'),
					'default' => ($val -> isDefaultValueAvailable())?$val -> getDefaultValue():''
					);
			}
		}
		if (!empty ($aTmp)) {
			return $aTmp;
		} else {
			return array ();
		}
	}

	/**
	* méthode privée getGeneral
	* sert à remplir le tableau des propriétés des propriétés de la classe à analyser
	* @Return : array aTmp
	*/
	private function getaProperties () {
		foreach ($this -> getProperties () as $val) {
			$aTmp[$val -> getName ()] = array (
				  'name' =>  $val->getName (),
				   'public' => $val -> isPublic()?'public':'',
				   'private' => $val -> isPrivate()?'private':'',
				   'protected' => $val -> isProtected()?'protected':'',
				   'static' => $val -> isStatic()?'static':'',
				   'default' => $val -> isDefault()?$this -> oloc -> getMsg ('doc', 'doc_yes'):$this -> oloc -> getMsg ('doc', 'doc_no'),
				   'modifiers' => $val->getModifiers(). ' => '.implode(' ', Reflection::getModifierNames($val->getModifiers())),
				   'comments' => method_exists ($val, 'getDocComment')?utf8_encode (htmlentities  ($val -> getDocComment ())):$this -> oloc -> getMsg ('errors', 'php_bad_version'),
				   'classe' => $val -> getDeclaringClass() -> getName (),
				   'code' => utf8_encode ($this -> getPropsCode ($val -> getDeclaringClass() -> getFileName (), $val -> getName())),
				);
			$aTmp[$val -> getName ()]['defaultvalue'] = ltrim (strstr ($aTmp[$val -> getName ()]['code'], '='), '=');
		}
		if (!empty ($aTmp)) {
			return $aTmp;
		} else {
			return array ();
		}
	}

	/**
	* méthode privée getPropsCode
	* sert à récupérer la portin de code où est définie une propriété donnée
	* @Params string fileName : nom du fichier où est définie la propriété
	* @Params string name : nom de la propriété
	* @Return : string code en cas de succès, false en cas d'échec
	*/
	private function getPropsCode ($fileName, $name) {
		if (!empty ($fileName)) {
			if (!array_key_exists ($fileName, $this -> fileBuf)) {
				$this -> fileBuf[$fileName] = file ($fileName);
			}
			$cpt = count ($this -> fileBuf[$fileName]);
			for ($i = 0; $i < $cpt; $i++) {
				if (false !== strpos ($this -> fileBuf[$fileName][$i], $name)) {
					$start = $i;
					break;
				}
			}
			if (isset ($start)) {
				for ($i = $start; $i < $cpt; $i++) {
					if (false !== strpos ($this -> fileBuf[$fileName][$i], ';')) {
						$end = $i;
						break;
					}
				}
			}
			if (isset ($end) && isset ($start)) {
				$code = '';
				for ($i = $start; $i <= $end; $i++) {
					$code .= $this -> fileBuf[$fileName][$i];
				}
				return $code;
			}
		}
		return false;
	}

}
?>

 Conclusion

Ci-dessus, uniquement la classe odoc.
Le zip contient le script complet, et un fichier readme.txt pour l'aide.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 février 2006 09:26:44 :
ajout d'un test sur l'existence de la méthode getDocComment (); si elle n'existe pas, on remplace le commentaire par une indication comme quoi la version de PHP5 est trop vieille pour supporter cette méthode.
09 février 2006 09:45:45 :
nouvelle mise à jour, ajout de la hiérarchie immédiate d'une classe dans la documentation : classe parente, classe fille qui l'a appelée.
09 février 2006 10:38:20 :
oui je sais, je suis prolifique ce matin ;-) Nouvelle mise à jour donc, ajout des paramètres des méthodes.
09 février 2006 10:42:21 :
Changement de la capture d'écran, pour reflèter les changements apportés à la classe
09 février 2006 10:46:15 :
Grr, problème avec la capture
09 février 2006 10:55:52 :
Nouvelle mise à jour encore : j'avais omis la différence entre l'héritage d'une classe, et d'une interface...problème réglé.
09 février 2006 12:13:45 :
encore une... : on peut désormais afficher le code (coloré), d'une méthode ou d'une classe.
09 février 2006 13:09:36 :
Ahem...oui je sais. Correction d'un petit bug sur la méthode isArray ()...maintenant, on détecte bien si un paramètre est un tableau ou non.
09 février 2006 15:10:16 :
encore une : cette fois, on a une iterface utilisateur :-) Le fichier readme.txt explique comment on s'en sert.
09 février 2006 15:26:28 :
ajout d'un fichier index2.php montrant comment ne pas passer par l'interface utilisateur :-)
09 février 2006 16:58:15 :
ajout de la détection des destructeurs (j'avais oublié) et d'améliorations mineures sur l'interface utilisateur.
09 février 2006 17:59:20 :
dernière mise à jour aujourd'hui : changements mnieurs sur les styles
10 février 2006 13:42:43 :
rajout de la documentation automatique pour les fonctions :-)
10 février 2006 14:59:34 :
mise à jour de la navigation, avec un nouveau fichier index.html, page d'accueil de la documentation.
10 février 2006 15:06:09 :
Modifs mineures sur le code
10 février 2006 16:39:59 :
Mise à jour de la capture
11 février 2006 03:46:03 :
Ajout de la localisation. Pour l'instant, je n'ai fait le français et l'anglais (mes connaissances dans les autres langues étant top limitées). Les documentations peuvent donc se faire dans les deux langues, chacune ayant son répertoire spécifique.
13 février 2006 10:13:12 :
Ajout de nouvelles css, pour démontrer que le design est facilement changeable. Il suffit pour cela de nommer la css voulue "maaindoc.css".
15 février 2006 11:34:20 :
Ajout de l'affichage du code de déclaration des propriétés de classe
15 février 2006 13:42:36 :
changement de la méthode __destruct(à en méthode freeHtml ()
16 février 2006 13:35:13 :
correction de bugs majeurs : si une classe n'a pas de propriétés...(ça buggait), et modification de la façon d'inclure les classes à documenter :-)
16 février 2006 16:01:03 :
petit ajout, prise en compte du fcait que plusieurs classes peuvent être déclarées dans le même fichier (petit oubli :-) )
16 février 2006 17:33:32 :
modification de l'expression régulière dans index.php
16 février 2006 18:04:39 :
ajout de la valeur par défaut définie pour les propriétés
21 février 2006 11:56:53 :
grosse mise à jour! J'ai corrigé un petit dysfonctionnement avec les classes php4, quand le nom de la classe et du constructeur est le même. Ils sont maintenant bien différenciés. J'ai aussi modifié le fonctionnement pour les classes, on fonctionne désormais par packages. Plus besoin de donner le nom de l'instance, l'outil le trouve tout seul. Il documente tout un package de classes. Chaque package a sa page d'index personnelle, avec un diagramme de la hiérarchie des classes.
21 février 2006 13:41:21 :
Petit oubli...
21 février 2006 14:05:44 :
Correction de bugs mineurs
21 février 2006 14:12:08 :
Petit bug sur la page index corrigé :-)
21 février 2006 14:41:51 :
Et une nouvelle correction de bug, une...cette fois, ça a l'air ok :-)
21 février 2006 15:13:11 :
Ben nan, restait un bug... ;-)
22 février 2006 10:17:26 :
changement dans la façon de traiter la localisation : dans le dossier 'locales', on trouve mainbtenant des sous-dossiers : 1 par localisation (français et anglais pour l'instant), et dans chacun de ces sous dossiers, 3 fichiers xml (1 par type : documentation, UI, erreurs).
22 février 2006 11:23:55 :
Ajout de l'allemand dans les langues supportées. UN grand merci à Bastian Gorke qui a fait la traduction :-)
22 février 2006 16:01:28 :
Ajout d'un nouveau screenshot, et correction d'un bug d'encodage dans les commentaires.
22 février 2006 17:50:44 :
Re modification concernant l'encoding.
01 mars 2006 15:01:45 :
Corrections de quelques bugs sur les interfaces

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip MY.DEVIANTART API par inwebo
Source avec Zip TESTS UNITAIRES par pierreSabatier
Source avec une capture CLASSE CONSTRUCTEUR DE TABLEAU HTML EN PHP (REVU ET CORRIGÉ) par demonstorm
WIKILOC : L'ARTICLE WIKIPEDIA SUR VOTRE MOBILE SFR LE PLUS P... par hhoareau
Source avec Zip CLASSE POUR EMPÊCHER LES SOUMISSIONS MULTIPLES DE FORMULAIRE par janhsh

Commentaires et avis

Commentaire de Anthomicro le 08/02/2006 20:11:23

C'est excellent quand je vois la capture (voir mon autre commentaire sur codes-php). je mets 10 sans hésitation.

Commentaire de neojet le 08/02/2006 22:22:12

Le titre aussi est pas mal ;-)

Commentaire de malalam le 09/02/2006 07:55:00 administrateur CS

Lol, la capture, le titre...qui a dit que pour plaire, fallait un bon code bien structuré, efficace, et qui tourne?? Naaan, un joli titre, une capture qui le fait...et z'avez 10 !! ;-)

Antho => je regerderai ce matin pour ton problème avec ce code...parce qu'en local je tourne aussi sous wamp, en php 5.1, et ça marche. Idem sur un des serveurs de prod, en php 5.1 aussi.
Donc je suis très étonné par la réaction de ton serveur devant mon code ;-) Je vais sans doute tester l'existence des méthodes avant de les lancer, dans ce cas...chais pas trop encore :-)

Commentaire de superbaloo78 le 09/02/2006 10:23:52

Salut,
malalam il est de toi ce script (j'ai pas regardé le code :D) ? parce que j'ai deja entendu parlé d'un gros projet qui permettait justement de documenter ses classes (c'est l'equivalent de phpmyadmin mais pour les classes en faite ...)

j'essayerai de retrouver le lien si j'ai le temps ...

Superbaloo

Commentaire de superbaloo78 le 09/02/2006 10:25:04

http://phpmanta.sourceforge.net/

mais c'est peut-etre un peu plus usine à gaz que le tien .... je sais pas j'ai pas essayé

Commentaire de stailer le 09/02/2006 10:37:22

"parce que j'ai deja entendu parlé d'un gros projet qui permettait justement de documenter ses classes"

Ben y en a à gaver des applications de documentation de classes et de projets PHP. PHPDOCUMENTOR, MANTA comme tu viens de le dire, DOXYGEN ou encore des solutions DOCBOOK, bref, c'est la grande mode du moment les documentations automatique.

Commentaire de malalam le 09/02/2006 10:40:16 administrateur CS

Superbaloo => oui il est de moi, et ce n'est pas une usine à gaz (pas l'intention d'ailleurs d'en faire une usine à gaz ;-) ). Et il documente tout seul. En fait, il ne va pas documenter DANS les classes, il crée une documentation html résumant la classe (et sa hiérarchie): type de classe, méthodes, propriétés, etc etc...et les commentaires utilisateurs.

Commentaire de malalam le 09/02/2006 10:48:19 administrateur CS

Et c'était plus pour m'amuser avec l'API de Réflexion de PHP5 qu'autre chose : ça faisait longtemps que je passais vite ce chapitre sans le lire (trop de trucs à lire), et il y a 2 jours, je me suis décidé à le lire. Et je me suis rendu compte que c'était très simple, et plutôt rigolo finalement. Donc j'ai décidé de développer une petite application qui en tire partie, pour voir jusqu'où on peut aller avec.

Commentaire de Anthomicro le 09/02/2006 11:17:49

"Lol, la capture, le titre...qui a dit que pour plaire, fallait un bon code bien structuré, efficace, et qui tourne?? Naaan, un joli titre, une capture qui le fait...et z'avez 10 !! ;-)"

Nan faut s'appeler Malalam aussi, je fais confiance et j'ai matté le code qu'est très proprement écrit ;-)

Commentaire de malalam le 09/02/2006 12:17:00 administrateur CS

Merci lol, et je plaisantais ;-)

Bon j'ai fait pas mal d'ajouts ce matin.
Notamment, on peut désormais voir le code d'une classe, ou d'une méthode. Ca ralentit pas mal la génération mais j'ai optmisé comme j'ai pu (ne pas réouvrir le fichier autant de fois qu'on a de méthode, si c'est le même fichier, par exemple).

Commentaire de malalam le 09/02/2006 12:19:03 administrateur CS

Tien au passage, ça devrait marcher pour toi maintenant, je teste toutes les méthodes que j'utilise et qui ont été incluse à partir de php5.1; si elles ne sont pas impléméntées, je ne les utilise pas.

Commentaire de malalam le 09/02/2006 13:47:08 administrateur CS

Bon ok, petite info lol : si vous n'avez pas php 5.1, n'essayez pas mon script sur les classes que je propose :-)
Essayez le sur VOS classes, les miennes vont poser des problèmes lors de leur inclusion dans la page index.php dûs à des spécificités php5.1
(merci Antho).

Commentaire de Anthomicro le 09/02/2006 14:05:59

J'ai mis à jour WAMP ^^ et ça marche, et c'est très beau ;-) donc le 10 est toujours de rigueur :-)

Commentaire de malalam le 09/02/2006 15:13:25 administrateur CS

Marciiii :-)

Commentaire de Anthomicro le 09/02/2006 15:51:40

Qui a mis 7 à ça franchement... pffff n'importe quoi on aura tout vu...

Commentaire de malalam le 09/02/2006 16:03:30 administrateur CS

Bah 7 c'est pas une mauvaise note lol, on a le droit de pas trouver ça parfait non plus ;-). Et je ne lui en veux pas du tout (je peux, vu que je sais qui c'est lol), 7 c'est convenable :-)
Mais bon, encore merci de défendre mon code lol ;-)

Commentaire de stailer le 09/02/2006 16:57:40

Tu penses rajouter la gestion des packages ?

Commentaire de malalam le 09/02/2006 17:00:55 administrateur CS

Des extensions? Je ne pense pas. La doc officielle le fait très bien toute seule, pour les packages officiels. Pour les autres, quelqu'un capable de développer une extension voudra sans doute développer sa propre doc. Mais bon, on verra...Dans un premier temps, je compte rajouter la documentation de fonctions simples.

Commentaire de malalam le 09/02/2006 17:02:49 administrateur CS

Heu, et merci, Stailer, pour le message que j'ai effacé (je l'ai effacé pour une autre raison que le compliment qui m'était adressé évidemment ;-) ).

Commentaire de stailer le 09/02/2006 17:08:44

(ok pour le message je comprends)
Non en fait je parlais des packages de documentation. Par exemple :

* @author stailer
* @version 1.0.1.2
* @name Persistance
* @package Persistance

Donc en fait je me demandais si tu allais générer un fichier (index.html par exemple) qui liste les noms des packages présent dans les répertoires. Et quand on clique sur un package, on accède aux classes de ce dernier.
Avec cette arborescence :

Package1
  - classe 1
  - classe 2
...

Commentaire de malalam le 09/02/2006 17:16:50 administrateur CS

Ah ben :
Non. Mais pourquoi pas, je vais y penser.
Voilà ce qui est fait de similaire :

- les commentaires sont bien récupérés, s'ils commencent ainsi :
/** blabla */ (je veux dire par là : slash, étoile, étoile, espace...puis ce qu'on veut, puis on ferme avec étoile et slash).

- les packages, c'est présent dans l'interface utilisateur que j'ai ajouté, oui, sauf que je ne liste pas le contenu des répertoires : juste les différentes documentées.
Je vais penser au fichier index.html, voui. Mais je veux l'organiser de la bonne manière, pour que ça ne pose de problème ni dans le cas d'une navigation directement dans le répertoire docs/ de mon script, ni en cas d'une copie de la documentation, vers un autre script.

Commentaire de malalam le 09/02/2006 17:20:51 administrateur CS

Heu pour le 2ème point, ce ne sont pas des packages, je voulais dire qu'il y a une liste des classes documentées, et un accès vers elles.
Mais pas pour les package de documentations, non. Pas encore en tous cas :-) C'est une bonne idée.

Commentaire de Isengard le 10/02/2006 13:42:45

Impressionant ! Vraiment bravo !!

Commentaire de malalam le 10/02/2006 13:44:26 administrateur CS

Isengard => Merci :-)
J'en, profite pour dire que je viens de faire une grosse mise à jour. On peut désormais documenter les fonctions. Le script va prendre toutes les fonctions utilisateurs définies dans un fichier uploadé, et les documenter, comme pour les classes :-)

Commentaire de coucou747 le 10/02/2006 19:23:42 administrateur CS

Salut
ce projet est très interessant, et j'éspère malam que tu n'en resteras pas là... (et oui désolé, mais je trouve que ça n'est pas achevé...)

Malam, t'as déja fait du perl ? Si oui, alors pourquoi t'as pas ajouté le POD ? Si non, alors renseignes toi sur le POD parcequ'avec ta source, on peut faire un truc géant...

Commentaire de malalam le 10/02/2006 20:55:31 administrateur CS

Hello Coucou,

Merci, déjà :-)
Je n'ai pas fini ma source en effet...mais si tu as des idées, je veux bien; parce que je vais vite être à court ;-) Le truc certain, c'est que je ne veux pas en faire une usine à gaz, de toutes façons.
Là, je suis entrain de finaliser la localisation (permettre de créer une doc dans une autre langue que le français), via des flux xml (mon dada :-) ).
J'ai fait un peu de perl oui, mais pas énormément. J'ai beaucoup aimé...mais jamais eu l'occasion d'approfondir, parce qu'au gré de mes changements de boîtes, aucune ne m'a permis de me lancer dans un projet Perl (et pourtant, j'ai même dû faire du delphi...c'est dire si c'est un comble lol).
Du coup, je ne sais pas de quoi tu parles, là. POD, kesako?

Commentaire de malalam le 10/02/2006 20:56:57 administrateur CS

Ok pour POD, je suis entrain de zyeuter ça sur le net.
Mais tu peux faire un résumé ;-)
Je me manifesterai quand j'aurai approfondi la chose.

Commentaire de coucou747 le 11/02/2006 09:08:01 administrateur CS

bah moi j'ai jamais fait beaucoup de perl non plus...
Le pod est un langage de mise en page qui se siturait entre le html et le latex... disons qu'on ajoute des commentaires dans la source pour produire les pages man de programmes perl sous linux, ou perldoc je crois...

maxime@devmax:~$ perldoc perldoc
NAME
       perldoc - Look up Perl documentation in Pod format.

Bon, donc, perldoc va chercher dans les sources la doc perl...

Pour moi, ce genre de module devrait être ajouté à ce genre de site, et on devrait créer une forme de CPAN pour php... (Antho, si tu m'entends...)

Commentaire de Anthomicro le 11/02/2006 10:00:21

Trop long j'ai pas le temps ^^

Commentaire de malalam le 11/02/2006 10:54:24 administrateur CS

Ouais on verra, pas fini de lire moi ;-) Ca a pas l'air facile ce que tu suggères, Coucou ;-)
En attendant, j'ai localisé ce code. On peut choisir entre français et anglais (les deux seules langues que je maîtrise assez...), et donc crééer une doc en français, et/ou en anglais. Les répertoires sont différents. C'est très simple à utiliser :-)
Il est aussi très simple d'ajouter une langue d'ailleurs! Il suffit de l'ajouter dans les 3 petits fichiers XML de localisation, dans le répertoire 'locales'(ils toutes les contiennent les traductions, sous forme de flux XML donc), et d'ajouter le bouton pour choisir la nouvelle langue dans le formulaire que j'ai isolé dans le fichier 'localize.form.html' à la racine du script :-)
Tout le reste est automatique.

Commentaire de coucou747 le 11/02/2006 20:48:14 administrateur CS

Malam, si tu veux bien, ne bosse pas sur le POD, je m'en charge :)

Commentaire de Missions_courtes le 13/02/2006 11:52:51

Bonjour,
Je n'arrive pas à voir l'image de la capture.
Je dois faire une mauvaise manoeuvre.

Commentaire de malalam le 13/02/2006 12:48:21 administrateur CS

Coucou => ok, c'est fait donc ;-) Mais ce que tu suggères, c'est que je donne la possibilité de générer la doc au format perldoc ? (puis utiliser ton source pour visualiser le format)

Missions_courtes => il suffit que tu cliques sur la vignette de la capture. Cela fonctionne bien pour moi (Firefox et IE).

Commentaire de coucou747 le 13/02/2006 19:03:15 administrateur CS

Malam, regarde la façon dont marche la CPAN : c'est un grouppe super gros : t'as des users qui postent des class et des fonctions, chaque grouppement de class et de fonctions sur un thème représente un module (enfin, c'est une librairie, mais on la nome module...) mais pour avoir de la documentation sur les modules, on ne se fait pas chier à séparer les codes... on les mélange, ce qui rend les codes beaucoup plus lisibles... Et bien la CPAN doit s'ouvrir à d'autres langages que le perl car c'est une méthode de programmation en grouppe qui a fait la gloire et la force de perl . Perl a aujourd'hui quelques avantages : il est facile à maitriser, il est rapide, il dispose de beaucoups de modules, d'utilisateurs, d'exemples, d'aide en ligne ou non, et il est déployé sur la plupart des machines linux, et facilement déployables sur les autres machines... Et on doit beaucoups de ces avantages à la CPAN (aide, groupes d'utilisateurs, modules, déploiment...). Ta source peut servir de base pour décrire tout le fonctionnement global d'un programme, et la façon de l'utiliser...

Tu pourrais même y ajouter des conventions de déclarations de fonctions (des prototypes pour les programmeurs C)... et comme ça, on verrait les types attendus, tu pourrais aussi lire les valeurs par défaut des paramètres... ect...

Bref, à ta place, si j'avais créé une source comme celle là, je ne la laisserais pas là... tu peux pousser l'analyse d'un code... permetre aux développeurs de faire du POD dans leurs programmes, leur permetre de déclarer les prototypes de fonctions, leur permetre de renvoyer à des pages de doc d'autres fonctions (les leurs ou sur le site php.net )...

Commentaire de malalam le 16/02/2006 13:52:02 administrateur CS

Hello Coucou,

ouais, je ne sais pas si j'ai envie d'aller aussi loin :-)
Enfin pourquoi pas, c'est une jolie idée, quand même.
Pour l'instant, je tâche d'améliorer le moteur de base (c'est à dire, pousser les fonctionnalités existantes, en créer de nouvelles, concernant justement l'analyse du code).
Ensuite, oui, pourquoi pas! Mais ce sera pour une nouvelle version je pense, plus orientée outil de développement.

Commentaire de coucou747 le 17/02/2006 19:52:09 administrateur CS

Bonne chance :)

Commentaire de malalam le 18/02/2006 09:37:14 administrateur CS

bon ben dans un premier temps, outre qques fonctionnalités supplémentaires, je vais modifier la façon de fonctionner de tout ça.
Je vais faire des uploads par "packages" de classes, afin de mettre plus en évidence les liens entre les classes d'un même package, avec un diagramme de leur hiérarchie, et un index commun au niveau du package.
J'ai déjà sorti les valeurs de retour, les valeurs par défaut des paramètres (mais ce n'est pas encore en ligne).
Ca se rapprochera déjà de ce que tu suggères :-)

Et merci, lol :-)

Commentaire de malalam le 21/02/2006 12:12:27 administrateur CS

Voilà, j'ai mis en place la notion de packages.
Le fonctionnement pour les classes a été profondément modifié... :-)
J'affiche aussi désormais le diagramme de la hiérarchie des classes d'un package. Pour l'instant c'est une liste xhtml, je me tâte pour en faire un diagramme GD, on va voir...

Commentaire de malalam le 22/02/2006 16:30:58 administrateur CS

Encore un petit mot pour faire une demande :
cet outil de documentation est localisé. J'ai fait moi-même les traductions françaises et anglaises.
Un gentil monsieur m'a fait la traduction en allemand sans que je ne le demande.
Donc, je fais un appel : si quelqu'un veut s'amuser à en faire la traduction dans une autre langue, je suis preneur!
Il suffit pour ça d'aller chercher dans le répertoire 'locales' la traduction de son choix (français en l'occurence je suppose). Il y a donc un sous-répertoire 'français', un 'english' et un 'deutsch'. Dans ces sous-répertoires se trouvent 3 fichierx xml (éditable avec n'importe quel éditeur de texte). Il suffit de les ouvrir, et de traduire le contenu.
Exemple d'un tag :
en français :
<doc_comments>Commentaires auteur</doc_comments>
en anglais :
<doc_comments>Author's comments</doc_comments>
en allemand :
<doc_comments>Authoren Kommentare</doc_comments>

Bref, il suffit de traduire ce qu'il y a à l'intérieur des tags xml.
Ensuite, vous pouvez m'envoyer par email (il se trouve dans mes fichiers, en ouvrant une classe dans le répertoire 'class' par exemple, en début de chaque fichier de classe) les 3 fichiers xml.

Merci :-)

Commentaire de Epoc22 le 25/10/2006 16:22:08

Nickel cette source !
10

ciao

Commentaire de malalam le 25/10/2006 16:33:17 administrateur CS

Merci :-)

Commentaire de bj33 le 18/11/2007 19:10:28 10/10

sajut

très beau travail! merci pour la communauté.

Commentaire de malalam le 18/11/2007 20:00:41 administrateur CS

Merci à toi :-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

diagramme de classe pour générateur de documentation [ par lili345 ] Bonjour,Voila je dois créer un générateur de documentation en php pour mon projet de stage  et je dois faire une analyse UML.Mais le problème c'est qu Aide sur API Google nxgooglemapsapi.php [ par koestel ] Bonjour,J'utilise la classe ''nxgooglemapsapi.php" pour mieux gèrer l'api google pour une applicationcela fonctionne mais j'aimerai pouvoir :Rajouter Api en php et fonctions pour construire un fichier XML a partir d'un DATA(urgent) [ par sonia5 ] Bonjour , tout lemondeje dois rèaliser un API ou je dois rèaliser une fonction qui permet de gènèrer un fichier XML à partir d'un argument Data de don Classe de gestion ftp: problème de passage de valeur? [ par spoutch ] Bonjour tout le monde ou tout du moins a ceux qui daignerons lire mon poste ^^Je travail en local sur le serveur Apache de wamp. A partir d'une source Facebook [ par achrafff ] Sujet : Développement d' un module de synchronisation des coordonnées des contacts du CRM open source de vtiger CRM à partir de FaceBook .je veux métr urgent [ par achrafff ] Bonjour,j'ai ce code je veux le développer,&lt;?php// Copyright 2007 Facebook Corp.  All Rights Reserved. // // Application: vtigerext// File: 'index. api google map [ par debogger ] existe t'il une api google map ecrit en php pour interagir sur une carte en fonction des coordonnées présente dans une base mysql Classe Connexion.php la plus simple possible .... [ par Tartuffe245 ] Bonjour à tous,J'ai créé une classe connexion pour mon site internet et il se trouve que j'ai une erreur qui revient souvent mais je ne sais pas comme POO - probleme de conception [ par Diablo62 ] Bonjour, Je débute en POO et j 'ai un petit soucis de conception j 'ai du mal a faire les liens entre mes objets.J'ai plusieurs objets : usager, utili API PDF en php [ par debogger ] slt la communauté je cherche un api en php pour pouvoir lire des cartes en pdf j'ai beaucoup fouillé sur le net j'ai pas trouvé grande chose cordialem


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales