
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Waanser &#187; Général</title>
	<atom:link href="http://www.waanser.com/category/php/general-php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.waanser.com</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Wed, 07 Jul 2010 21:54:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Web-Service en SOAP avec php</title>
		<link>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html</link>
		<comments>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 20:10:23 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[WEB 2.0]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2346</guid>
		<description><![CDATA[Dans cet article, nous allons apprendre à faire notre premier web-service SOAP en 15 minutes top chrono ! Pour suivre, il est indispensable d&#8217;utiliser eclipse, car celui-ci possède un mode graphique pour la création de web-service qui va nous faciliter la vie. Le fonctionnement Avant toutes choses, je vais vous expliquer rapidement le fonctionnement d&#8217;un [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cet article, nous allons apprendre à faire notre premier web-service SOAP en 15 minutes top chrono !</p>
<p>Pour suivre, il est indispensable d&#8217;utiliser eclipse, car celui-ci possède un mode graphique pour la création de web-service qui va nous faciliter la vie.</p>
<h2>Le fonctionnement</h2>
<hr/>
 Avant toutes choses, je vais vous expliquer rapidement le fonctionnement d&#8217;un Web-Service.</p>
<p>Vous savez certainement qu&#8217;un <span style="color:green"> Web-Service est un programme qui permet la communication et l&#8217;échange de données entre des applications et des systèmes totalement différents.</span><br/> <br/>Pour que le Web-Service puisse communiquer avec n&#8217;importe quels systèmes, il faut utiliser un même format de données.  Pour nous, ça sera le <span style="color:blue"> <strong>SOAP</strong></span>(c&#8217;est un protocole procédural basé sur du XML). Dans ce format, il faut aussi bien définir les données qui seront reçues et envoyées par le Web-Service.<br/><br/> Ne vous inquiétez pas si cela vous paraît trop abstrait, on va tout expliquer avec un exemple. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
Par exemple grâce à Web-Service, on pourrait faire communiquer une application java d&#8217;un téléphone portable avec une application en php. (ça fait rêver &#8230; <img src='http://www.waanser.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p>
<p>Voici une petite illustration du fonctionnement de ce Web-Service :<br />
<br/><br />
<strong>Première étape : </strong><br />
 L&#8217;application java va faire appel au web-service en envoyant un message <strong>WSDL </strong>(en SOAP).<br />
<br/><br />
<a href="http://media.waanser.com/2009/11/etape1.jpg"><img src="http://media.waanser.com/2009/11/etape1.jpg" alt="etape1" title="etape1" width="718" height="196" class="alignnone size-full wp-image-2351" /></a></p>
<hr/>
<strong>Deuxième étape : </strong><br />
Le serveur de Web-Service reçoit la demande, effectue un traitement en fonction de celui-ci et renvoie la réponse dans un format <strong>WSDL</strong>.<br />
<br/><br/></p>
<p><a href="http://media.waanser.com/2009/12/etape2.jpg"><img src="http://media.waanser.com/2009/11/etape2.jpg" alt="SOAP PHP" title="etape2" width="680" height="175" class="size-full wp-image-2354" /></a><br />
<br/><br />
Qui avait dit que c&#8217;était compliqué les web-service <img src='http://www.waanser.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ?<br />
<br/><br />
Fini la théorie passons à la pratique, nous allons faire un Web-Service qui nous donne le jour en fonction de la date que l&#8217;on envoie.</p>
<h2>Création du wsdl</h2>
<hr/>
Par exemple, on envoie le 13/11/2009 et le web-service nous renverra vendredi. Si on fait un schéma, cela va donner ça.<br />
<br/></p>
<p><a href="http://media.waanser.com/2009/11/soapws.jpg"><img src="http://media.waanser.com/2009/11/soapws.jpg" alt="soapws" title="soapws" width="721" height="314" class="alignnone size-medium wp-image-2361" /></a></p>
<p>Nous allons créer un nouveau projet que nous appellerons <strong>MonWebService </strong>(il n&#8217;y a pas plus clair ^^).<br />
<br/><br />
On va commencer par faire <strong>le format WSDL </strong>(fichier soap) de notre web service.</p>
<hr/>
<p><a href="http://media.waanser.com/2009/12/ws11.jpg"><img src="http://media.waanser.com/2009/12/ws11-300x247.jpg" alt="ws11" title="ws11" width="300" height="247" class="alignnone size-medium wp-image-2372" /></a><br />
<br/><br />
On le nomme <strong>monFormat.wsdl</strong></p>
<p>Pour nous aider, Eclipse nous construit automatiquement un format wsdl par défaut, nous allons le reprendre et le paramétrer. Mais avant tout, je vais vous parler rapidement de l&#8217;interface. <br/></p>
<hr/><br/><br />
En bas à Gauche, vous avez remarqué 2 onglets :<br />
 &nbsp;&nbsp;&nbsp;&nbsp;<strong>Desing </strong>=> l&#8217;interface<br />
 &nbsp;&nbsp;&nbsp;&nbsp;<strong>Source </strong>=> le format wsdl que l&#8217;interface génère<br />
Rassurez vous, nous aurons pas à toucher au fichier source, on va créer notre format <strong>wsdl </strong>seulement avec l&#8217;interface <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br/><br />
Vous devriez voir ça, normalement :</p>
<hr/>
<p><a href="http://media.waanser.com/2009/12/ws3.jpg"><img src="http://media.waanser.com/2009/12/ws3.jpg" alt="eclipse affichage defaut wsdl soap webservice" title="ws3" width="600" height="100" class="size-medium wp-image-2381" /></a></p>
<p>C&#8217;est avec la boîte à gauche que l&#8217;on définit l&#8217;adresse du serveur du web-service ( c&#8217;est là où tout le traitement php va se faire), Dans le champ de saisie, il faudra mettre : <strong>http://localhost/MonWebService/serveur.php</strong></p>
<hr/>
A droite, ce sont les <strong>différents services</strong> (ou opérations) que le web-service propose.<br/><br />
Dans notre exemple, nous proposons qu&#8217;un seul service. On va l&#8217;appeler <strong>QuelJour</strong>.<br />
Le nom de l&#8217;opération par défaut est <strong>NewOperation </strong>en double cliquant dessus on peut le renommer.<br/><br />
C&#8217;est d&#8217;ailleurs  ce que l&#8217;on va faire en le renommant <strong>QuelJour</strong>.</p>
<hr/>
Juste en dessous, on voit 2 lignes :</p>
<p><strong>Input </strong>qui représente les données que va recevoir le Web-Service<br />
<strong>Output </strong>qui représente les données que va envoyer le Web-Service<br />
<br/><br />
Tout le monde suit ? <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
Nous allons définir le paramètre d&#8217;entrée. </p>
<p>En entrée, on aura besoin d&#8217;une <strong>chaine de caractère(string)</strong>.<br />
Pour se faire, on fait un clique droit sur case la plus à droite de la <strong>ligne input</strong>, dans le menu contextuel<br />
On clique sur <strong>Set Type</strong> puis<strong> Existing Type</strong> et là on sélectionne <strong>string</strong>.<br />
<br/><br />
On réitère cette opération pour le paramètre de sortie.</p>
<hr/>
Ce qui va donner :<br />
<a href="http://media.waanser.com/2009/12/w2.jpg"><img src="http://media.waanser.com/2009/12/w2.jpg" alt="webservice wsdl interface eclipse" title="w2" width="600" height="100" class="size-medium wp-image-2374" /></a><br />
<br/><br />
Voilà nous avons définit notre format de web service !</p>
<hr/>
<h2>Du serveur au client</h2>
<p>On va s&#8217;attaquer à notre serveur, préparez vos doigts ça va coder !</p>
<p>On va le nommer<strong> serveur.php</strong><br />
<span style="color:red">Attention</span>, le chemin de votre fichier doit être le même que celui que vous avez paramétré dans votre web-service. <br/><br />
Ex : <span style="color:green">http://localhost/MonWebService/serveur.php</span> => <span style="color:green">C:\wam\www\MonWebService\serveur.php</span></p>
<p>Voici le code source, les commentaires parlent d&#8217;eux-même :<br />
<br/></p>
<pre class="brush: php">
// Pour supprimer le cache du web-service
ini_set(&#039;soap.wsdl_cache_enabled&#039;, 0);
// Pour définir le temp maximal d&#039;éxecution de notre web-service
ini_set(&#039;default_socket_timeout&#039;, 180);

// Nom de notre web-service
class Server {
     // Le service QuelJour que l&#039;on a définit dans notre format wsdl
    function QuelJour($parm) {
    	return &#039;Web-Service ok&#039;;
    }
}
// On tente d&#039;instancier la classe soapServer
// Si cela s&#039;avère impossible, on affiche une erreur
try {
    $server = new SoapServer(&#039;monFormat.wsdl&#039;,  array(&#039;trace&#039; =&gt; 1,&#039;encoding&#039;	=&gt; &#039;ISO-8859-1&#039;));
    // On définit la classe qui va gérer les requêtes SOAP (pour nous c&#039;est la class Server)
    $server -&gt; setclass(&#039;Server&#039;);
    $server-&gt;setPersistence(SOAP_PERSISTENCE_REQUEST);
} catch (Exception $e) {
    echo &#039;erreur&#039;.$e;
}
// Si l&#039;appel provient d&#039;un Web-Service
if ($_SERVER[&#039;REQUEST_METHOD&#039;] == &#039;POST&#039;) {
	try {
		$server -&gt; handle();}
	catch (Exception $e) {
    echo &#039;erreur&#039;.$e;
	}
}
// Facultatif seulement pour montrer les fonctions disponibles par le web-service
else {
    echo &#039;&lt;strong&gt;This SOAP server can handle following functions : &lt;/strong&gt;&#039;;
    echo &#039;&lt;ul&gt;&#039;;
    foreach($server -&gt; getFunctions() as $func) {
        echo &#039;&lt;li&gt;&#039; , $func , &#039;&lt;/li&gt;&#039;;
    }
    echo &#039;&lt;/ul&gt;&#039;;
}
</pre>
<p><br/><br />
Si tout se passe bien et si on se rend sur cette adresse :</p>
<p>http://localhostMonWebService/serveur.php</p>
<p><br/><br />
On devrait voir :<br />
<img src="http://media.waanser.com/2009/12/ws4.jpg" alt="web service php serveur soap wsdl" title="ws4" width="449" height="82" class="size-full wp-image-2385" /></a><br />
<br/><br />
Tout marche ? On est trop fort \o/</p>
<hr/>
Pour l&#8217;instant, on va juste afficher un message qui indique que le web-service fonctionne bien. (eh oui, on commence simple pour faire plus compliquer ensuite <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )<br />
<br/><br />
Côté client, nous allons créer un fichier <strong>client.php</strong></p>
<pre class="brush: php">
// Pour supprimer le cache du web-service
ini_set(&#039;soap.wsdl_cache_enabled&#039;, 0);

// Nouveau Client SOAP
try {
    // Nouvelle instance de la classe soapClient
   $client = new SoapClient(&#039;http://localhost/MonWebService/monFormat.wsdl&#039;, array(&#039;trace&#039; =&gt; 1));
   $parm = date(&#039;Y-m-d&#039;);
    // Appel de la méthode QuelJour du service web
   try{
    $oReturn =  $client -&gt; __soapCall(&#039;QuelJour&#039;, array(&#039;string&#039; =&gt;$parm));
	} catch (SoapFault $fault) {
    	trigger_error(&quot;SOAP Fault: (faultcode: {$fault-&gt;faultcode}, faultstring: {$fault-&gt;faultstring})&quot;, E_USER_ERROR);
	}
        // affiche le résultat
	var_dump($oReturn);
} catch (SoapFault $fault) {
    echo &#039;erreur : &#039;.$fault;
}
</pre>
<hr/>
On a plus qu&#8217;à se rendre sur <strong>http://localhostMonWebService/client.php</strong> pour voir notre message.<br />
<br/><br />
Eh voilà la mécanique est en place, on va pouvoir améliorer notre web-service, mais là on ne va rien apprendre, ce n&#8217;est que du php <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
<br/><br />
On va revenir sur notre serveur (fichier <strong>serveur.php</strong>), dans la fonction <strong>QuelJour</strong><br />
pour traiter la chaîne en paramètre.<br />
<br/><br />
Notre fonction va donc devenir : </p>
<pre class="brush: php">
    function QuelJour($parm) {
    	$aJour[1] = &#039;Lundi&#039;;
    	$aJour[2] = &#039;Mardi&#039;;
    	$aJour[3] = &#039;Mercredi&#039;;
    	$aJour[4] = &#039;Jeudi&#039;;
    	$aJour[5] = &#039;Vendredi&#039;;
    	$aJour[6] = &#039;Samedi&#039;;
    	$aJour[0] = &#039;Dimanche&#039;;
    	return $aJour[date(&quot;w&quot;,strtotime($parm))];
    }
</pre>
<hr/>
<h2>Debugger un web-service</h2>
<p>Le debugage d&#8217;un web-service est toujours difficile. Le client interprète directement la réponse du web-service et si la réponse n&#8217;est pas correctement formaté (qui ne respecte pas le format wsdl du web-service), il affiche une erreur du type : <br/><br />
<span style="color:red">( ! ) Fatal error: SOAP Fault: (faultcode: Client, faultstring: looks like we got no XML document) in /var/www/MonWebService/client.php on line 17 Call Stack #TimeMemoryFunctionLocation 10.000158584{main}( )../client.php:0 20.002180708trigger_error ( )../client.php:17</span></p>
<hr/>
Mais il ne renvoie pas l&#8217;erreur php du serveur. Je suis d&#8217;accord avec vous, ce n&#8217;est pas facile la vie d&#8217;un développeur :&#8217;(<br />
Pour savoir, ce que renvoie exactement le serveur, nous allons utiliser l&#8217;application <strong>SOAPUI</strong><br />
<br/><br />
Une fois installée, vous allez créer un projet. Pour ceci vous allez dans<br />
<strong>File </strong>→ <strong>New soapUIProject</strong>.</p>
<hr/>
Là, une fenêtre apparaît, vous cliquez sur parcourir (browse&#8230;), vous sélectionnez votre fichier wsdl<br />
(<strong>monFormat.wsdl</strong>) puis <strong>OK</strong>.<br/><br />
<a href="http://media.waanser.com/2009/12/ws5.jpg"><img src="http://media.waanser.com/2009/12/ws5.jpg" alt="web service xsql soapui" title="ws5" width="180" height="47" class="size-full wp-image-2390" /></a></p>
<hr/>
Dans le menu <strong>projects</strong>, vous déroulez votre arborescence <strong>monformat </strong> jusqu&#8217;à voir le nom de la fonction que vous voulez tester, (pour nous c&#8217;est <strong>Queljour</strong>).<br/><br />
Clique droit puis<strong> New Request</strong> et SoapUI créer votre interface pour communiquer avec les web-service.<br />
<br/><br />
Si vous avez bien suivit, voila ce que vous devriez voir :<br />
<br/><br />
<a href="http://media.waanser.com/2009/12/ws6.jpg"><img src="http://media.waanser.com/2009/12/ws6.jpg" alt="webservice debug entete http" title="ws6" width="650" height="90" class="size-full wp-image-2391" /></a><br/><br />
Vous avez plus qu&#8217;à faire les tests et récupérer directement le résultat du web service. </p>
<p><strong>Les erreurs : </strong><br />
<br/><br />
Pendant le développement de différents de web-services, je suis tombé sur des erreurs de toute part, malheureusement je ne les ai pas tous mémorisé mais voici un début de liste qui pourrait vous aider. Si vous aussi vous êtes embétez un petit commentaire et on pourra certainement vous aider. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
SoapFault exception: [HTTP] Not Found in /var/www/lab/customer.php:10 Stack trace: #0 [internal function]: SoapClient->__doRequest(&#8216;__call(&#8216;getServerDate&#8217;, Array) #2 {main}<br />
=> wsdl trouve pas le serveur</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Installer et utiliser Pear</title>
		<link>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html</link>
		<comments>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 19:25:27 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2237</guid>
		<description><![CDATA[Pear est une bibliothèque php qui permet de gérer les installations des librairies php. Nous allons voir dans ce tutoriel comment installer PEAR et faire une première utilisation. Installation Pour l&#8217;installation, nous allons commencer à ouvrir une invite de commande dos. Et commencer par faire : set PATH=%PATH%;C:\wamp\php Normalement dans votre dossier php, vous avez [...]]]></description>
			<content:encoded><![CDATA[<p>Pear est une bibliothèque php qui permet de gérer les installations des librairies php.<br />
Nous allons voir dans ce tutoriel comment installer PEAR et faire une première utilisation.</p>
<h2>Installation</h2>
<p>Pour l&#8217;installation, nous allons commencer à ouvrir une invite de commande dos.<br />
Et commencer par faire :</p>
<p>set PATH=%PATH%;C:\wamp\php</p>
<p>Normalement dans votre dossier php, vous avez un dossier PEAR, il faut s&#8217;y rendre. </p>
<p>Par exemple, pour wamp il faut taper :     cd C:\wamp\php\PEAR</p>
<hr/>
<p>Vous trouverez un fichier <strong>php go-pear.phar</strong>, il suffit de l&#8217;exécuter :</p>
<p>php go-pear.phar</p>
<p>Et là, l&#8217;installation se lance <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="attachment_2238" class="wp-caption alignnone" style="width: 453px"><a href="http://media.waanser.com/2009/06/pear.jpg"><img src="http://media.waanser.com/2009/06/pear.jpg" alt="installation pear" title="pear" width="443" height="110" class="size-full wp-image-2238" /></a><p class="wp-caption-text">installation pear</p></div>
<p>Si vous voulez que l&#8217;installation de pear concerne toutes les sessions d&#8217;utilisateurs, il faut mettre system.</p>
<hr/>
<p>Un récapitulatif des chemins de configuration de pear est affiché, vous pouvez laisser la configuration par défaut, elle est très bien.</p>
<div id="attachment_2239" class="wp-caption alignnone" style="width: 575px"><a href="http://media.waanser.com/2009/06/pear1.jpg"><img src="http://media.waanser.com/2009/06/pear1.jpg" alt="installation pear" title="pear1" width="565" height="306" class="size-full wp-image-2239" /></a><p class="wp-caption-text">installation pear</p></div>
<p>Dernière étape, on accepte de modifier notre fichier php.ini pour qu&#8217;il prenne en compte notre bibliothèque PEAR.</p>
<div id="attachment_2240" class="wp-caption alignnone" style="width: 542px"><a href="http://media.waanser.com/2009/06/pear2.jpg"><img src="http://media.waanser.com/2009/06/pear2.jpg" alt="pear installation" title="pear" width="532" height="104" class="size-full wp-image-2240" /></a><p class="wp-caption-text">pear installation</p></div>
<p>Eh voilà c&#8217;est installé <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<div id="attachment_2241" class="wp-caption alignnone" style="width: 440px"><a href="http://media.waanser.com/2009/06/pear3.jpg"><img src="http://media.waanser.com/2009/06/pear3.jpg" alt="pear installation" title="pear3" width="430" height="119" class="size-full wp-image-2241" /></a><p class="wp-caption-text">pear installation</p></div>
<hr/>
<h2>Première utilisation</h2>
<p>Nous allons installer la librairie <strong>DATE</strong></p>
<p>Dans un premier temps nous allons faire :</p>
<p>set PATH=%PATH%;C:\wamp\php\PEAR</p>
<p>Il faut aller ensuite sur <a href="http://pear.php.net/packages.php">http://pear.php.net/packages.php</a>.</p>
<p>Date and Time -> Date -> Download.</p>
<hr/>
<p>On va récupérer la commande pour le téléchargement :</p>
<div id="attachment_2242" class="wp-caption alignnone" style="width: 284px"><a href="http://media.waanser.com/2009/06/pear4.jpg"><img src="http://media.waanser.com/2009/06/pear4.jpg" alt="utilisation pear" title="pear4" width="274" height="100" class="size-full wp-image-2242" /></a><p class="wp-caption-text">utilisation pear</p></div>
<p>Pour moi, il faut taper :</p>
<p>pear install Date-1.5.0a1</p>
<hr/>
Si vous avez une erreur du type :</p>
<p>PEAR Fatal error: Allowed memory size of 8388608 bytes exhausted</p>
<p>Il faut modifier votre fichier C:\wamp\php\php.ini, aller dans l&#8217;attribut memory_limit = 8M<br />
et remplacer par : memory_limit = 256M</p>
<p>Comme ça, on est tranquille <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
<pre class="brush: php">
// on fait appel a notre librairie PEAR
set_include_path(get_include_path() . &quot;;C:\wamp\php\PEAR\pear&quot;);

require_once &#039;DATE.php&#039;;
$now = new Date();

//UNIX timestamp:
echo $now-&gt;getTime().&#039;&lt;br/&gt;&#039;;

//format de date iso
echo $now-&gt;getDate();
</pre>
<p>Et voilà, vous savez utiliser PEAR <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La révolution du debug avec FirePHP</title>
		<link>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html</link>
		<comments>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html#comments</comments>
		<pubDate>Wed, 01 Apr 2009 15:15:50 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1382</guid>
		<description><![CDATA[Il y a autant de technique de développement que de façon de debugger. Les normes de développement et consensus permettent au développeur de produire du code propre. Mais pour ce qui est du débug, chaque développeur débug comme il le sent (les affichages bruts à l&#8217;écran, la création de fichier de log, ou l&#8217;envoi des [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a autant de technique de développement que de façon de debugger. Les normes de développement et consensus permettent au développeur de produire du code propre. Mais pour ce qui est du débug, chaque développeur débug comme il le sent (les affichages bruts à l&#8217;écran, la création de fichier de log, ou l&#8217;envoi des données par mail).En plus de mettre de l&#8217;ordre dans le debug, le plugin Firephp permet aussi de faire des deboggages plus optimisés.</p>
<h2>FirePHP qu&#8217;est ce que c&#8217;est ?</h2>
<p>Tout d&#8217;abord FirePHP  est un plugin firefox, qui s&#8217;attache à celui de firebug.<br />
 Les données de debug sont représentées de cette façon :<br />
<a href="http://media.waanser.com/2009/04/firephp.png"><img src="http://media.waanser.com/2009/04/firephp.png" alt="firephp" title="firephp" class="alignnone size-full wp-image-1383" /></a></p>
<p>C&#8217;est à l&#8217;aide d&#8217;une classe php, que l&#8217;on va définir les données de debug à afficher.<br />
Et c&#8217;est cette classe php, qui envoie ces données au format JSON.<br />
Pour finir le plugin s&#8217;occupe d&#8217;afficher les données.</p>
<p>Passons maintenant à la pratique <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Installation</strong></p>
<p>Si vous ne l&#8217;avez pas fait , il faut installer <a href="https://addons.mozilla.org/fr/firefox/addon/1843">firebug</a>,une fois ceci fait, vous pouvez installer le plugin <a href="https://addons.mozilla.org/en-US/firefox/addon/6149">firephp</a>.</p>
<p>Maintenant nous allons récupérer la dernière version de la <a href="http://framework.zend.com/download/latest">librairie </a>.</p>
<p>Nous allons voir si firePHP fonctionne :</p>
<pre class="brush: php">
require_once &#039;./FirePHPCore/FirePHP.class.php&#039;;
$oFirebug = FirePHP::getInstance(true);
$oFirebug-&gt;fb(&#039;FirePhp fonctionne !&#039;);
</pre>
<p>Voilà ce que cela doit donner :</p>
<p><a href="http://media.waanser.com/2009/04/firephp1.png"><img src="http://media.waanser.com/2009/04/firephp1.png" alt="firephp" title="firephp1" class="alignnone size-full wp-image-1388" /></a></p>
<p>Si vous ne voyez rien, c&#8217;est que vous avez oublié d&#8217;activer la surveillance réseau de votre firebug:</p>
<p><a href="http://media.waanser.com/2009/04/firephp2.png"><img src="http://media.waanser.com/2009/04/firephp2.png" alt="firebug surveillance réseau" title="firephp2" class="alignnone size-full wp-image-1389" /></a></p>
<h2>Utilisation de firePhp</h2>
<p>Avant toute chose, il faut bien avoir en tête que ces données sont visibles par tous les visiteurs qui possèdent firePHP. Il est préférable d&#8217;afficher les données dans un environnement de développement ou de test.</p>
<p>Normalement avec l&#8217;exemple de fonctionnement vous avez déjà du tout comprendre <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>$oFirebug  = FirePHP::getInstance(true);</strong><br />
c&#8217;est notre objet firebug.<br />
<strong>$f->fb(&#8216;FirePhp fonctionne !&#8217;);</strong><br />
 pour afficher un message.</p>
<p><strong>Grouper les variables de debug</strong></p>
<p>Vous pouvez regroupez vos variables de debug avec Firephp. Cela peut être utile si vos tests se font sur plusieurs fonctions.</p>
<pre class="brush: php">
$oFirebug-&gt;group(&#039;Fonction animal&#039;);
$oFirebug-&gt;log(&#039;Chien&#039;);
$oFirebug-&gt;log(&#039;Chat&#039;);
$oFirebug-&gt;log(&#039;Poisson&#039;);
$oFirebug-&gt;groupEnd();

$oFirebug-&gt;group(&#039;Fonction ville&#039;);
$oFirebug-&gt;log(&#039;Lens&#039;);
$oFirebug-&gt;log(&#039;Rennes&#039;);
$oFirebug-&gt;log(&#039;Caen&#039;);
$oFirebug-&gt;groupEnd();
</pre>
<p>Voilà ce que ça donne :</p>
<p><a href="http://media.waanser.com/2009/04/firephp3.png"><img src="http://media.waanser.com/2009/04/firephp3.png" alt="firephp" title="firephp3" class="alignnone size-full wp-image-1391" /></a></p>
<p><strong>Définir des niveaux d&#8217;erreurs</strong></p>
<p>Tout comme l&#8217;objet error_reporting de php, avec firePHP on peux définir un niveau d&#8217;erreur.</p>
<p>méthode <strong>info</strong> : ressemble au notice<br />
méthode <strong>warn</strong> : ressemble au warning<br />
méthode <strong>error</strong> : ressemble au fatal error</p>
<pre class="brush: php">
$oFirebug-&gt;log(&#039;Plain Message&#039;);     // or FB::
$oFirebug-&gt;info(&#039;Info Message&#039;);     // or FB::
$oFirebug-&gt;warn(&#039;Warn Message&#039;);     // or FB::
$oFirebug-&gt;error(&#039;Error Message&#039;);   // or FB::
</pre>
<p>Firebug va donc afficher :</p>
<p><a href="http://media.waanser.com/2009/04/firephp4.png"><img src="http://media.waanser.com/2009/04/firephp4.png" alt="firephp" title="firephp4" class="alignnone size-full wp-image-1392" /></a></p>
<p><strong>Afficher les tableaux</strong></p>
<p>C&#8217;est avec la méthode <strong>table()</strong> que l&#8217;on va pouvoir afficher les tableaux avec FirePHP</p>
<p>Voici un exemple de code :</p>
<pre class="brush: php">
$aTable   = array();
$aTable[] = array(&#039;Col 1 Heading&#039;,&#039;Col 2 Heading&#039;);
$aTable[] = array(&#039;Row 1 Col 1&#039;,&#039;Row 1 Col 2&#039;);
$aTable[] = array(&#039;Row 2 Col 1&#039;,&#039;Row 2 Col 2&#039;);
$aTable[] = array(&#039;Row 3 Col 1&#039;,&#039;Row 3 Col 2&#039;);

$oFirebug-&gt;table(&#039;Table Label&#039;, $aTable)
</pre>
<p>Cela donne :</p>
<p><a href="http://media.waanser.com/2009/04/firephp5.png"><img src="http://media.waanser.com/2009/04/firephp5.png" alt="firephp" title="firephp5" class="alignnone size-full wp-image-1393" /></a></p>
<p><strong>Laissez des traces avec trace()</strong></p>
<p>Affiche un bascktrace de la ligne ou est tapée la méthode <strong>trace()</strong>.</p>
<p>Voici un exemple d&#8217;utilisation:</p>
<pre class="brush: php">
mess($oFirebug);
function mess($oFirebug)
{
 $oFirebug-&gt;trace(&#039;Trace Label&#039;);
}
</pre>
<p>Firephp va afficher :</p>
<p><a href="http://media.waanser.com/2009/04/firephp6.png"><img src="http://media.waanser.com/2009/04/firephp6.png" alt="firephp" title="firephp6" class="alignnone size-full wp-image-1396" /></a></p>
<p><strong>Attraper les erreurs avec firePhp</strong></p>
<p>On peut aussi gérer l&#8217;affichage des erreurs par firePhp</p>
<pre class="brush: php">
$oFirebug-&gt;registerErrorHandler();
$oFirebug-&gt;registerExceptionHandler();

try {
  throw new Exception(&#039;Test erreur&#039;);
} catch(Exception $e) {
  $oFirebug-&gt;error($e);
}
</pre>
<p>Et voila notre belle erreur <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://media.waanser.com/2009/04/firephp7.png"><img src="http://media.waanser.com/2009/04/firephp7.png" alt="firephp" title="firephp7" class="alignnone size-full wp-image-1398" /></a></p>
<p>On a fait le tour de firePhp, vous pouvez maintenant debugger en toute transparence.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test Unitaire avec simpletest</title>
		<link>http://www.waanser.com/php/general-php/795-test-unitaire-avec-simpletest.html</link>
		<comments>http://www.waanser.com/php/general-php/795-test-unitaire-avec-simpletest.html#comments</comments>
		<pubDate>Tue, 10 Feb 2009 18:44:18 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=795</guid>
		<description><![CDATA[Les tests unitaires sont très utile pour vérifier si les mise à jours ne génèrent pas des bugs de régressions. Nous allons voir comment faire des test unitaires fiables en php en utilisant la librairie simpletest. Mis en place de simpletest Pour télécharger la librairie c&#8217;est ici. Vous pouvez allez aussi sur le site officiel [...]]]></description>
			<content:encoded><![CDATA[<p>Les tests unitaires sont très utile pour vérifier si les mise à jours ne génèrent pas des bugs de régressions.<br />
Nous allons voir comment faire des test unitaires fiables en php en utilisant la librairie simpletest.<span id="more-795"></span></p>
<h2>Mis en place de simpletest</h2>
<p>Pour télécharger la librairie c&#8217;est <a href="http://sourceforge.net/project/downloading.php?groupname=simpletest&#038;filename=simpletest_1.0.1.tar.gz&#038;use_mirror=dfn">ici</a>. Vous pouvez allez aussi sur le <a href="http://simpletest.org/index.html">site officiel</a> pour télécharger la dernière version.</p>
<div id="attachment_796" class="wp-caption alignnone" style="width: 221px"><a href="http://media.waanser.com/2009/02/simpletest.png"><img src="http://media.waanser.com/2009/02/simpletest.png" alt="simpletest dernière version" title="simpletest" width="211" height="39" class="size-full wp-image-796" /></a><p class="wp-caption-text">simpletest dernière version</p></div>
<p>Dans ce tutoriel nous allons créer une classe de toute pièce pour faire nos tests unitaires.</p>
<p>Nous allons créer un dossier operation où nous allons mettre notre dossier décompressé simpletest.</p>
<h2>comment construire un test unitaire</h2>
<p>Construire un test unitaire efficace, demande beaucoup d&#8217;abstraction. En effet le test unitaire à la responsabilité de prévoir de façon exhaustive toute les possibilités et les comportements d&#8217;un code source. On peu dire que le test unitaire doit s&#8217;assurer que le code source fonctionne en toute circonstance et qu&#8217;il répond aux spécifications fonctionnelles. </p>
<p><strong>Roul, mais comment veux tu que je fasse test unitaire qui prévoie tout ?</strong></p>
<p>Ne vous inquiétez pas, je suis loin d&#8217;être un as en développement <img src='http://www.waanser.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> , mais j&#8217;arrive à faire des test unitaires corrects. D&#8217;ailleurs vous allez voir que ce n&#8217;est vraiment pas compliqué, parce que allons justement en faire un (sur une classe très simple). Il faut juste suivre une bonne méthode de travail pas à pas et ne pas précipiter les choses ^^. Mettez vos combinaisons nous allons devoir tester une classe vraiment pas propre &#8230;</p>
<h2>La classe opération</h2>
<p>Nous allons commencer, par créer une classe toute simple. La classe opération, cette classe donnera juste la possibilité d&#8217;effectuer des opérations basiques (addition, soustraction, multiplication &#8230;.) sur des réels.</p>
<pre class="brush: php">
class operation
{
	public function __construct()
	{
		;
	}
	public function addition($fNb1,$fNb2) {
		return $fNb1 + $fNb2;
	}
}
</pre>
<p>Donc la première méthode de la classe opération, est de faire une addition.<br />
Nous allons faire le test unitaire ce cette méthode.</p>
<p>On va faire appel à la librairie simpletest.</p>
<pre class="brush: php">
require_once(&#039;simpletest/unit_tester.php&#039;);
require_once(&#039;simpletest/reporter.php&#039;);
require_once(&#039;./operation.class.php&#039;);
</pre>
<p>Là on va créer notre classe de testUnitaire qui héritera de la classe UniTestCase.</p>
<pre class="brush: php">
class testUnitaireOperation extends UnitTestCase {
	function __construct() {
	      $this-&gt;UnitTestCase(&#039;Test unitaire sur la classe operation&#039;);
        }
}
</pre>
<p>Maintenant on va tester notre méthode addition. </p>
<p>Comment simpletest test une addition ?</p>
<p>En fait c&#8217;est très simple, on va faire appel à une série de méthode simpletest.<br />
Chaque méthodes simpletest va faire appel aux fonctions que nous allons tester (pour nous, ça sera la méthode addition). Chaque méthodes simpletest vont bien entendu attendent un résultat.<br />
Si les résultats ne correspondent pas à ce que l&#8217;on attend, simpletest va tout de suite afficher un message d&#8217;erreur et indiquer sa provenance.</p>
<p>On va commencer par cette méthode :</p>
<p><strong>$this->assertIsA</strong></p>
<p>Alors, dans cette méthode on va lui indiquer un type. Ensuite il va vérifier si l&#8217;objet passé en paramètre est bien du même type que celui-ci.<br />
C&#8217;est pas très clair ? Bon on va voir un exemple <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  :</p>
<p>$this->assertIsA($oKevin, &#8216;garçon&#8217;); </p>
<p>Le test unitaire vérifie si l&#8217;objet $oKevin est bien un objet du type garçon.</p>
<p>Revenons dans notre classe opération. Pour commencer nous allons vérifier si l&#8217;objet oMonOpération que l&#8217;on va créer est bien du type operation :</p>
<pre class="brush: php">
public function testAddition() {
	echo &#039;Debut des test sur les additions &#039;.&quot;n&quot;;
	// Creation du objet operation
	$oMonOperation = new operation();
	$this-&gt;assertIsA($oMonOperation, &#039;operation&#039;);
}
</pre>
<p>Pour déclencher le test, juste après votre classe vous pouvez faire :</p>
<pre class="brush: php">
$oOperationTest = &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;new testUnitaireOperation();
$oOperationTest-&gt;run(new TextReporter());
</pre>
<p>Vous pouvez lancer votre test unitaire via interface Web <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Normalement le test unitaire devrait bien se dérouler et vous devriez voir ça :</p>
<div id="attachment_833" class="wp-caption alignnone" style="width: 431px"><a href="http://media.waanser.com/2009/02/testunitaire.png"><img src="http://media.waanser.com/2009/02/testunitaire.png" alt="test unitaire" title="testunitaire" width="421" height="74" class="size-full wp-image-833" /></a><p class="wp-caption-text">test unitaire</p></div>
<p>Comment lire le résultat :</p>
<p><strong>Passes </strong>: Le nombre de test qui sont se bien déroulé.<br />
<strong>Failures </strong>:  Le nombre de test dont résultat ne corresponds pas à ce que l&#8217;on attends.<br />
<strong>Exceptions </strong>: Le nombre de test qui ont généré une erreur.</p>
<p>Nous allons voir une autre méthode de simpletest. Cell-ci vérifie si la fonction testée, retourne bien vrai.<br />
<strong>$this->assertTrue</strong><br />
la fonction qui vérifie si la fonction retourne faux c&#8217;est :<br />
<strong>$this->assertFalse</strong></p>
<p>Pour notre test unitaire nous allons utiliser la méthode assertTrue pour vérifier si la méthode addition peut être appeler (a travers l&#8217;objet opération).</p>
<p>notre test unitaire doit maintenant ressembler à ça :</p>
<pre class="brush: php">
public function testAddition() {
echo &#039;Debut des test sur les additions &#039;.&quot;n&quot;;
        // Creation du objet operation
        $oMonOperation = new operation();
        $this-&gt;assertIsA($oMonOperation, &#039;operation&#039;);
        $aMethode = array($oMonOperation, &#039;addition&#039;);
         //Appel de la methode addition
        $this-&gt;assertTrue(is_callable($aMethode, true));
}
</pre>
<p>Maintenant, on doit avoir deux tests qui sont passés. C&#8217;est vrai pour l&#8217;instant ce test unitaire n&#8217;est pas très utile.<br />
Mais ne vous inquiétez pas, nous allons vite arriver sur des cas que l&#8217;on avait pas forcément pensé.<br />
Les test unitaires vont se faire un plaisir de nous rappeler à l&#8217;ordre.</p>
<p><strong>$this->assertEqual</strong></p>
<p>Pour cette méthode il faut deux paramètres. Le premier c&#8217;est la fonction que l&#8217;on veut tester,<br />
et le second c&#8217;est ce que doit renvoyer la fonction.<br />
Si on veut tester la commande addition, on va faire une addition du style 1 + 1 et notre méthode devra retourner &#8230; (ou est cette calculette ?) &#8230; 2 ! <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En langage php cela donne : $this->assertEqual($oMonOperation->addition(1,1), 2);</p>
<p>Pour notre classe opération on va faire toute une batterie de test pour vérifier que tout fonctionne bien.</p>
<pre class="brush: php">
public function testAddition() {
	echo &#039;Debut des test sur les additions &#039;.&quot;n&quot;;
	// Creation du objet operation
	$oMonOperation = new operation();
	$this-&gt;assertIsA($oMonOperation, &#039;operation&#039;);
	$aMethode = array($oMonOperation, &#039;addition&#039;);
	//Appel de la methode addition
	$this-&gt;assertTrue(is_callable($aMethode, true));
	// 1 + 1 = 1
	$this-&gt;assertEqual($oMonOperation-&gt;addition(1,1), 2);
	// 1 + 0 = 0
	$this-&gt;assertEqual($oMonOperation-&gt;addition(1,0), 1);
	// 0 + 1 = 1
	$this-&gt;assertEqual($oMonOperation-&gt;addition(0,1), 1);
	// 24 112 126 468 + 54 456 123 123 = 78 568 249 591
	$this-&gt;assertEqual($oMonOperation-&gt;addition(24112126468,54456123123), 78568249591);
	// 12.5 + 13.3 = 25.8
	$this-&gt;assertEqual($oMonOperation-&gt;addition(12.5,13.3), 25.8);
}
</pre>
<p>Super ! nos 7 tests sont passés <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Jusque là c&#8217;était facile, maintenant nous allons nous lancer sur des tests plus perspicaces.</p>
<p><strong>Mais comment faire Roul ?</strong></p>
<p>Il faut juste essayer de pourrir notre code en envoyant tout et n&#8217;importe quoi en paramètre.</p>
<p>Pour le test unitaire de la méthode addition on va faire :</p>
<p>$this-&gt;assertFalse($oMonOperation-&gt;addition(&#8216;a&#8217;,12));</p>
<p>On test &#8230;.</p>
<div id="attachment_843" class="wp-caption alignnone" style="width: 697px"><a href="http://media.waanser.com/2009/02/testunitaire1.png"><img src="http://media.waanser.com/2009/02/testunitaire1.png" alt="test unitaire" title="testunitaire1" width="687" height="99" class="size-full wp-image-843" /></a><p class="wp-caption-text">test unitaire</p></div>
<p>Oh lalala ! La belle erreur ! Notre fonction ne renvoie pas faux, mais 120.<br />
Notre fonction, n&#8217;est pas encore opérationnelle, on va vite corriger ça.</p>
<pre class="brush: php">
public function addition($fNb1,$fNb2) {

	if (is_numeric($fNb1) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; is_numeric($fNb2))
	{
		return $fNb1 + $fNb2;
	}else{
		return false;
	}
}
</pre>
<p>C&#8217;est bon, tout passe ^^.</p>
<p>Vous savez maintenant faire des test-unitaires. Bien sur ce test unitaire n&#8217;est pas du tout fiable, on devrait faire des batteries des tests beaucoup plus importantes. Il n&#8217;est pas nécessaire d&#8217;approfondir plus sur le test d&#8217;addition, parce que chaque test unitaire est propre au code qu&#8217;il vérifie. </p>
<p><strong>Oui, je sais faire un test unitaire, mai j&#8217;ai un gros blanc, je ne sais pas quoi tester, comment faire ???</strong></p>
<p>En fait la démarche pour faire les test vous la connaissez déjà.<br />
Dans un premier temps on vérifie si notre fonction ne retourne pas d&#8217;erreur.<br />
Puis nous faisons différents tests pour voir si les fonctions retournent bien le résultat demandé.<br />
Et enfin, on en fait voir de toutes les couleurs à nos fonctions(voir si elle ne génère pas d&#8217;erreur).</p>
<p>Après en fonction des spécifications techniques, on peux faire des test unitaire sur la consommation de mémoire (qui est un vrai problème en php) ou sur la vitesse d&#8217;exécution du script.</p>
<h2>Quand faut-il faire les tests unitaires ?</h2>
<p>En fait cela dépend de votre projet, mais il faut savoir qu&#8217;il y a trois techniques différents pour savoir quand construire ces tests unitaires :</p>
<p><strong>La technique classique </strong>: le code d&#8217;abord, les tests ensuite.<br />
<strong>La technique inversée </strong>: les tests d&#8217;abord et le code ensuite<br />
<strong>La technique entrelacée</strong> : on fait les test en fonction de l&#8217;avancement du projet.</p>
<h2>Un dernier exemple plus poussée</h2>
<p>On va construire la méthode division de notre classe opération :</p>
<pre class="brush: php">
public function division($fNb1,$fNb2) {

	if (is_numeric($fNb1) &amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp; is_numeric($fNb2))
	{
		return $fNb1 / $fNb2;
	}else{
		return false;
	}
}
</pre>
<p>Et on va reprendre notre test unitaire de la méthode addition pour faire celle de la méthode division.</p>
<pre class="brush: php">
public function testDivision() {
	echo &#039;Debut des test sur les divisions &#039;.&quot;n&quot;;
	// Creation du objet operation
	$oMonOperation = new operation();
	$this-&gt;assertIsA($oMonOperation, &#039;operation&#039;);
	$aMethode = array($oMonOperation, &#039;division&#039;);
	//Appel de la methode division
	$this-&gt;assertTrue(is_callable($aMethode, true));
	// 1 / 1 = 1
	$this-&gt;assertEqual($oMonOperation-&gt;division(1,1), 1);
	// 1 / 0 = faux
	$this-&gt;assertFalse($oMonOperation-&gt;division(1,0));
	// 0 / 1 = 0
	$this-&gt;assertEqual($oMonOperation-&gt;division(0,1), 0);
	// 24 112 126 468 / 54 456 123 123 = 0.442
	$this-&gt;assertEqual($oMonOperation-&gt;division(24112126468,54456123123), 0.442);
	// 12 / 4 = 3
	$this-&gt;assertEqual($oMonOperation-&gt;division(12,4), 3);
	// a / 12 =&gt; false
	$this-&gt;assertFalse($oMonOperation-&gt;division(&#039;a&#039;,12));
}
</pre>
<p>Eh la, malheur ! nos tests unitaires nous renvoie que des erreurs.</p>
<p><a href="http://media.waanser.com/2009/02/testunitaire2.png"><img src="http://media.waanser.com/2009/02/testunitaire2.png" alt="test unitaire" title="testunitaire2" class="alignnone size-full wp-image-852" /></a></p>
<p>Maintenant il reste plus qu&#8217;à debugger, mais la ce n&#8217;est pas l&#8217;objectif du tutoriel, et pour moi il est l&#8217;heure de me coucher <img src='http://www.waanser.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/795-test-unitaire-avec-simpletest.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>tutoriel PhpDocumentor</title>
		<link>http://www.waanser.com/php/general-php/665-tutoriel-phpdocumentor.html</link>
		<comments>http://www.waanser.com/php/general-php/665-tutoriel-phpdocumentor.html#comments</comments>
		<pubDate>Fri, 30 Jan 2009 18:10:50 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[code propre]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=665</guid>
		<description><![CDATA[PhpDocumentor est une application qui sert à générer automatiquement une documentation php à partir des commentaires du code source. Nous allons apprendre à l&#8217;utiliser. Installation rapide de PhpDocumentor : Vous l&#8217;aurez deviné, il faut tout d&#8217;abord le télécharger C&#8217;est par ici. Une fois décompressé vous allez mettre votre dossier PhpDocumentor dans la racine de votre [...]]]></description>
			<content:encoded><![CDATA[<p>PhpDocumentor est une application qui sert à générer automatiquement une documentation php à partir des commentaires du code source. Nous allons apprendre à l&#8217;utiliser.<br />
<span id="more-665"></span></p>
<h2>Installation rapide de PhpDocumentor : </h2>
<p>Vous l&#8217;aurez deviné, il faut tout d&#8217;abord le télécharger <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  C&#8217;est par <a href='http://phpdoc.org/downloads.php'>ici</a>.</p>
<div id="attachment_668" class="wp-caption alignnone" style="width: 459px"><a href="http://media.waanser.com/2009/01/phpdocumentator.png"><img src="http://media.waanser.com/2009/01/phpdocumentator.png" alt="php documentator" title="phpdocumentator" width="449" height="108" class="size-full wp-image-668" /></a><p class="wp-caption-text">php documentator</p></div>
<p>Une fois décompressé vous allez mettre votre dossier PhpDocumentor dans la racine de votre dossier <strong>www</strong>.</p>
<p>Bravo vous avez installé PhpDocumentor <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Comme vous l&#8217;imagez PhpDocumentor met un certain temps pour générer toute la documentation d&#8217;une application php. Et apache par défaut limite le traitement du script php à 30 secondes. Ce qui bien évidement ne suffit pas pour faire tourner PhpDocumentor. Pour pallier ce problème il suffit de modifier fichier php.ini :</p>
<p>max_execution_time = 0;<br />
max_input_time = 0;</p>
<p>Comme ça on est tranquille il n&#8217;y a plus de limite <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Configuration de PhpDocumentator</h2>
<p>Il faut se rendre sur cette <a href='http://localhost/PhpDocumentor/docbuilder/'>adresse</a> pour arriver la page d&#8217;administration de PhpDocumentor.</p>
<p>En haut à gauche vous allez voir ce menu :</p>
<div id="attachment_674" class="wp-caption alignnone" style="width: 556px"><a href="http://media.waanser.com/2009/01/phpdocumentator1.png"><img src="http://media.waanser.com/2009/01/phpdocumentator1.png" alt="PhpDocumentor" title="phpdocumentor" width="546" height="80" class="size-full wp-image-674" /></a><p class="wp-caption-text">PhpDocumentator</p></div>
<p>C&#8217;est l&#8217;onglet <strong>Files</strong> qui va nous intéresser.</p>
<p><strong>Directory to parse</strong> : C&#8217;est le chemin du dossier où se situe votre application php (celui que phpDocumentor va traiter)</p>
<p><strong>Files to ignore</strong> : On doit indiquer les types de fichier à ne pas traiter (ex : *.png, *.jpg, *.css)</p>
<p>Passons maintenant à l&#8217;onglet <strong>Output</strong>.</p>
<p><strong>Target</strong>  : Nous allons indiquer l&#8217;adresse où notre documentation va être générée ( ex: C:wampwwwdoc)</p>
<p><strong>Output Format</strong> : C&#8217;est la forme que prendra votre doc (vous aurez le choix entre du xml , html ou pdf)</p>
<p>La dernière modification sera dans l&#8217;onglet Options.</p>
<p><strong>Generated Documentation Title</strong> : C&#8217;est le nom de votre documentation.</p>
<h2>Génération de la documentation</h2>
<p>La c&#8217;est le plus simple on a juste à cliquer sur un bouton :</p>
<div id="attachment_685" class="wp-caption alignnone" style="width: 160px"><a href="http://media.waanser.com/2009/01/documentor.png"><img src="http://media.waanser.com/2009/01/documentor.png" alt="php documentor" title="documentor" width="150" height="37" class="size-full wp-image-685" /></a><p class="wp-caption-text">php documentor</p></div>
<p>La il faut attendre un peu que le script se génère. La durée est relative à la taille de votre application.</p>
<p>Si vous voyez ça, c&#8217;est que votre doc est bien généré :</p>
<div id="attachment_687" class="wp-caption alignnone" style="width: 304px"><a href="http://media.waanser.com/2009/01/phpdocumentator2.png"><img src="http://media.waanser.com/2009/01/phpdocumentator2.png" alt="PhpDocumentor" title="phpdocumentator2" width="294" height="108" class="size-full wp-image-687" /></a><p class="wp-caption-text">PhpDocumentor</p></div>
<p>Oui, ma doc est bien formée, mais j&#8217;ai pratiquement pas d&#8217;information dessus.<br />
<strong>Mais comment cela se fait-il Roul ???  <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
<p>Si vous avez une documentation appauvrie, c&#8217;est que vous avez mal commenté vos fonctions dans votre code source php.</p>
<p>Voici un exemple qui devrait faire une documentation assez complète : </p>
<pre class="brush: php">
/**
 * @author Roul
 * @access public
 * @param float $fNombre
 * @todo double le nombre entré en paramètre
 * @return float
 */

 public function double(float $fNombre)
 {
 	return $fNombre*2;
 }
</pre>
<p>Si vous voulez plus d&#8217;indications sur le formatage des commentaires je vous conseille de lire <a href='http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.pkg.html'> ceci </a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/665-tutoriel-phpdocumentor.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>gettext</title>
		<link>http://www.waanser.com/php/general-php/184-get-text.html</link>
		<comments>http://www.waanser.com/php/general-php/184-get-text.html#comments</comments>
		<pubDate>Tue, 06 Jan 2009 13:56:22 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[traduction]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=184</guid>
		<description><![CDATA[L&#8217;utilisation de gettext est certainement la façon la plus sure de traduire un site. Nous allons voir comment l&#8217;installer et l&#8217;utiliser en toute simplicité. Fonctionnement gettext Pour pouvoir appliquer des traductions avec gettext on va avoir besoin de deux types de fichiers : .po : C&#8217;est le fichier où l&#8217;on va entrer les traductions. Ce [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;utilisation de gettext est certainement la façon la plus sure de traduire un site.<br />
Nous allons voir comment l&#8217;installer et l&#8217;utiliser en toute simplicité.<br />
<span id="more-184"></span></p>
<h2>Fonctionnement gettext</h2>
<p>Pour pouvoir appliquer des traductions avec gettext on va avoir besoin de deux types de fichiers :</p>
<ul>
<li><strong>.po</strong> : C&#8217;est le fichier où l&#8217;on va entrer les traductions. Ce fichier est uniquement lisible par les humains.</li>
<li><strong>.mo </strong>: C&#8217;est le fichier compilé  du .po où son stockées les traductions. Ce fichier est uniquement lisible par php.</li>
</ul>
<p><img src="http://media.waanser.com/2009/01/get_texy_fonctionnement.bmp" alt="fonctionnement du get text" title="gettext_fonctionnement" class="alignnone size-full wp-image-197" /></p>
<h2>L&#8217;installation gettext</h2>
<p>Pour l&#8217;installer sur votre serveur, il n&#8217;y a rien de plus simple. Il suffit d&#8217;entrer <em>&laquo;&nbsp;apt-get install php-gettext&nbsp;&raquo;</em> dans votre console linux (attention il faut être loguer en root), Et tout s&#8217;installe automatiquement.</p>
<h2>L&#8217;organisation des traductions</h2>
<p>Pour ne pas se perdre au milieu de tous les fichiers de traductions,  nous allons créer un dossier par langue.</p>
<div id="attachment_209" class="wp-caption alignnone" style="width: 179px"><img src="http://media.waanser.com/2009/01/arbo_sque_trad.png" alt="arborescence gettext" title="arborescence gettext" width="169" height="127" class="size-full wp-image-209" /><p class="wp-caption-text">arborescence gettext</p></div>
<h2>L&#8217;utilisation de gettext en php</h2>
<p>Dans un premier temps vous devez retrouver votre fichier gettext.inc pour l&#8217;inclure<br />
Il doit se situer normalement dans &laquo;&nbsp;/usr/share/php/php-gettext/&nbsp;&raquo;.</p>
<p>Nous allons créer notre premier fichier multilingue : bienvenue.php</p>
<pre class="brush: php">
//inclusion de la librairie gettext
require_once(&#039;/usr/share/php/php-gettext/gettext.inc&#039;);

$dir=setlocale(LC_ALL, &#039;fr_FR&#039;);
if($dir ==&#039;&#039;)
{
	die(&quot;Erreur : la localisation n&#039;est pas implémentée sur votre plate-forme ou la variable de localisation n&#039;existe pas&quot;);
}
// Spécifie la localisation des tables de traduction
bindtextdomain(&quot;welcome&quot;, &quot;./language&quot;);

// Choisit le domaine
textdomain(&quot;welcome&quot;);

// La traduction est cherché dans ./language/fr_FR/LC_MESSAGES/welcome.mo

// Affichage d&#039;un message de test
echo gettext(&quot;hello&quot;).&quot;&lt;/br&gt;&quot;;

// Ou utilisation de l&#039;alias _() pour gettext()
echo _(&quot;goodbye&quot;);
</pre>
<p>Maintenant il faut ouvrir votre page bienvenue.php.<br />
Normalement vous devriez voir le message &laquo;&nbsp;hello&nbsp;&raquo; suivit de &laquo;&nbsp;goodbye&nbsp;&raquo;;<br />
Ceci est normal, vu que gettext ne trouve pas la traduction, il affiche alors le mot non traduit.</p>
<h2> création et compilation des fichiers de traductions</h2>
<p>Tout d&#8217;abord nous allons créer notre fichier de traduction.<br />
Dans votre console linux, positionnez-vous dans le dossier où ce situe votre fichier bienvenue.php</p>
<p>Une fois ceci fait, on lance la comande :<br />
<em>xgettext -kT_gettext -kT_  bienvenue.php</em></p>
<p>Le gettext va alors récupèrer les chaînes à traduire dans le code source bienvenue.php, il va génèrer automatiquement le fichier .po</p>
<p>Un fichier messages.po doit être créer dans la racine, nous allons le renommer welcome.po et le copier dans <em>&laquo;&nbsp;languagefr_FRLC_MESSAGES&nbsp;&raquo;</em></p>
<p>Maintenant nous allons pouvoir éditer notre fichier et traduire les mots répertoriés(de la page bienvenue.php) par get text.</p>
<p>Pour qu&#8217;une traduction soit effectuée, il faut définir un identifiant de message : <strong>msgid</strong> et le texte attacher à celui-ci : <strong>msgtr</strong>.</p>
<p>pour nous nous allons mettre : </p>
<pre class="brush: sql">
#: bienvenue.php:19
msgid &quot;hello&quot;
msgstr &quot;salut&quot;

#: bienvenue.php:20
msgid &quot;goodbye&quot;
msgstr &quot;aurevoir&quot;
</pre>
<p>Pour compiler notre fichier welcome.po, il faut utiliser la commande msgfmt.<br />
Il faut bien sur ce positionner dans le dossier ou est situé welcome.po, et taper &laquo;&nbsp;<em>msgfmt welcome.po -o welcome.mo </em>&nbsp;&raquo;<br />
Normalement vous devez voir apparaître votre fichier welcome.mo.</p>
<p>Voici ce que cela va donner au final sur notre arborecence :</p>
<div id="attachment_206" class="wp-caption alignnone" style="width: 189px"><img src="http://media.waanser.com/2009/01/arbo_trad1.png" alt="arborescence gettext" title="arborescence gettext" width="179" height="235" class="size-full wp-image-206" /><p class="wp-caption-text">arborescence gettext</p></div>
<p>Maintenant vous pouvez ouvrir votre page bienvenue.php</p>
<p>eh la ! Miracle on voit que la traduction se met en français <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/184-get-text.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

