<?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>Totalement Geek ! &#187; php</title>
	<atom:link href="http://totalement.geek.oupas.fr/article/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://totalement.geek.oupas.fr</link>
	<description>... ou pas.</description>
	<lastBuildDate>Tue, 29 Nov 2011 09:54:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Une (des nombreuses) bizarrerie de PHP</title>
		<link>http://totalement.geek.oupas.fr/article/2010/12/23/une-des-nombreuses-bizarrerie-de-php</link>
		<comments>http://totalement.geek.oupas.fr/article/2010/12/23/une-des-nombreuses-bizarrerie-de-php#comments</comments>
		<pubDate>Thu, 23 Dec 2010 10:59:03 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/?p=351</guid>
		<description><![CDATA[Je viens de tomber sur un bug qui m&#8217;a paru assez étrange au premier abord, mais qui, après réflexion est tout a fait &#171;&#160;normal&#160;&#187;. Dans mon code, je testais l&#8217;égalité entre 2 chaines de caractères ("0000000123" et "000123") et ça me retournait true alors que j&#8217;attendais false. En réfléchissant 2 minutes, voici ce que php [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de tomber sur un bug qui m&#8217;a paru assez étrange au premier abord, mais qui, après réflexion est tout a fait &laquo;&nbsp;normal&nbsp;&raquo;.</p>
<p>Dans mon code, je testais l&#8217;égalité entre 2 chaines de caractères (<code>"0000000123"</code> et <code>"000123"</code>) et ça me retournait <code>true</code> alors que j&#8217;attendais <code>false</code>.</p>
<p>En réfléchissant 2 minutes, voici ce que php effectue:</p>
<ol>
<li>est-ce que la chaine A est identique à la chaine B: non</li>
<li>est-ce qu&#8217;en castant la chaine A et/ou B, j&#8217;arrive à trouver une égalité: oui</li>
</ol>
<p>En effet, en castant les 2 chaines en entier, on obtient 123 et l&#8217;égalité est trouvée.</p>
<p>Comment faire alors pour que PHP retourne <code>false</code> ? En utilisant l&#8217;opérateur <code>===</code> qui teste non seulement l&#8217;égalité mais vérifie également qu&#8217;ils sont de même type. En réalité, ça teste l&#8217;égalité sans faire de cast. En conséquence de quoi, <code>==</code> est très légèrement plus lent que <code>===</code>. En d&#8217;autres termes, si vous codez bien connaissez exactement le type de vos données, préférez <code>===</code> car il est plus rapide.</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2010/12/23/une-des-nombreuses-bizarrerie-de-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Mettre ses tables en UTF8 avec Doctrine (même les plugins)</title>
		<link>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins</link>
		<comments>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins#comments</comments>
		<pubDate>Mon, 29 Jun 2009 19:06:10 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/?p=184</guid>
		<description><![CDATA[Pour mettre ses tables en UTF8 avec Doctrine et le framewok Symfony, rien de plus simple. Tout en haut de votre(vos) schema.yml, ajoutez les lignes suivantes: options: collate: utf8_unicode_ci charset: utf8 Malheureusement, les fichiers schema.yml des plugins ne seront pas affecté car il faut que ce bout de code soit répété en haut de chaque [...]]]></description>
			<content:encoded><![CDATA[<p>Pour mettre ses tables en UTF8 avec Doctrine et le framewok Symfony, rien de plus simple.</p>
<p>Tout en haut de votre(vos) schema.yml, ajoutez les lignes suivantes:</p>
<pre>options:
  collate: utf8_unicode_ci
  charset: utf8</pre>
<p>Malheureusement, les fichiers schema.yml des plugins ne seront pas affecté car il faut que ce bout de code soit répété en haut de chaque schema.yml.</p>
<p>Heureusement, <a href="http://borreli.com/" target="_blank">[MA]Pascal</a> m&#8217;a donné une astuce de sioux qui permet de résoudre ce problème. Il suffit d&#8217;utiliser l&#8217;héritage des tables dans Doctrine. Par exemple, voici ce que ca donnerait pour le plugin sfDoctrineGuardPlugin:</p>
<pre>sfGuardGroupUtf8:
  inheritance:  { extends: sfGuardGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardGroupPermissionUtf8:
  inheritance:  { extends: sfGuardGroupPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardPermissionUtf8:
  inheritance:  { extends: sfGuardPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardRememberKeyUtf8:
  inheritance:  { extends: sfGuardRememberKey, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserUtf8:
  inheritance:  { extends: sfGuardUser, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserGroupUtf8:
  inheritance:  { extends: sfGuardUserGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserPermissionUtf8:
  inheritance:  { extends: sfGuardUserPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }</pre>
<p><a href="http://borreli.com/" target="_blank">[MA]Pascal</a> me disait même qu&#8217;il étendait les fonctionnalités des plugins de cette façon, mais je ne sais pas dans quelle mesure on peut étendre une classe d&#8217;un plugin et espérer que cela fonctionne encore&#8230;</p>
<p>[MA]Pascal, si tu passes par là et si tu veux bien nous expliquer :p</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2009/06/29/symfony-mettre-ses-tables-en-utf8-avec-doctrine-meme-les-plugins/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony: bench des ORM Propel et Doctrine</title>
		<link>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine</link>
		<comments>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine#comments</comments>
		<pubDate>Sat, 14 Feb 2009 14:01:30 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[propel]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/?p=150</guid>
		<description><![CDATA[Symfony, pour ceux qui ne connaissent pas encore, est un framework PHP puissant et français, développé par Sensio Labs. Contrairement à d&#8217;autres framework qui réinventent la roue, symfony s&#8217;appuie sur des librairies externes qui ont fait leur preuve. C&#8217;est précisément le cas pour l&#8217;ORM. Dans ses premières versions, symfony n&#8217;intégrait que Propel et le changement [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony, pour ceux qui ne connaissent pas encore, est un framework PHP puissant et français, développé par Sensio Labs.</p>
<p>Contrairement à d&#8217;autres framework qui réinventent la roue, symfony s&#8217;appuie sur des librairies externes qui ont fait leur preuve. C&#8217;est précisément le cas pour l&#8217;<a href="http://fr.wikipedia.org/wiki/Mapping_objet-relationnel" target="_blank">ORM</a>.</p>
<p>Dans ses premières versions, symfony n&#8217;intégrait que <a href="http://propel.phpdb.org/" target="_blank">Propel</a> et le changement d&#8217;ORM était relativement difficile, malgré l&#8217;existence d&#8217;un plugin <a href="http://www.doctrine-project.org/" target="_blank">Doctrine</a>, car certains outils du framework, notament l&#8217;Admin Generator, s&#8217;appuyait uniquement sur Propel.</p>
<p>Depuis la version 1.1, Propel est un plugin et ne fait plus parti du core de symfony. Depuis la version 1.2, l&#8217;Admin Generator peut utiliser indifféremment Propel ou Doctrine. C&#8217;est une très bonne nouvelle pour la communauté. Du coup, chaque développeur peut choisir l&#8217;ORM qui lui convient le mieux&#8230; mais aussi se poser la question fatidique &laquo;&nbsp;Quel est le meilleur ORM ?&nbsp;&raquo;</p>
<p>Cette question, je me la suis, moi-même posée.</p>
<p>Pour y répondre, il faut prendre en compte plusieurs points (liste non exhaustive et non ordonnée):</p>
<ul>
<li>la facilité d&#8217;apprentissage</li>
<li>la rapidité de développement</li>
<li>les capacités offertes par l&#8217;ORM (vs les besoins qu&#8217;on a)</li>
<li>la rapidité d&#8217;exécution</li>
</ul>
<p>Et c&#8217;est sur ce dernier point (pas forcément le plus important) que je suis me suis penché car j&#8217;ai lu à divers endroits que Doctrine était sacrément plus lent que Propel.</p>
<p>J&#8217;ai donc commencé à faire quelques benchmark. Ou plutôt une &laquo;&nbsp;plateforme&nbsp;&raquo; de benchmark qui n&#8217;attend que vous pour être complétée. En effet:</p>
<ul>
<li>étant débutant avec symfony, propel et doctrine, je ne peux garantir que tout soit bien optimisé, j&#8217;ai donc besoin de l&#8217;aide de demi-dieu de symfony et/ou propel et/ou doctrine</li>
<li>à plusieurs nous arriverons mieux à faire un benchmark suffisamment complet et représentatif du type de requête utilisé dans un site web.</li>
</ul>
<p>J&#8217;ai donc publié le code sur googlecode et l&#8217;accès au svn vous sera ouvert sur simple demande (mail/msn/gtalk de contact en haut à droite de ce blog).</p>
<p>url du projet: <a href="http://benchsymfonyorm.googlecode.com" target="_blank">http://benchsymfonyorm.googlecode.com</a></p>
<p>Le projet contient un répertoire pour chaque ORM avec, à l&#8217;intérieur, un projet symfony.</p>
<p>J&#8217;ai séparé chaque ORM dans un projet différent car l&#8217;utilisation de Propel et Doctrine pourrait fausser les résultats.</p>
<p>Les benchs sont tous dans des task afin que le serveur web n&#8217;influe pas sur les résultats.</p>
<p>Les remarques <strong>constructives</strong> sont évidemment les bienvenues. Les trolls velus totalement interdits et carrément supprimés des commentaires s&#8217;ils montrent le bout de leur nez.</p>
<p>Comme dit plus haut, je ne prétends pas avoir faire un système parfait et les améliorations sont donc les bienvenues&#8230; en fait, c&#8217;est un peu le but de ce projet :)</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2009/02/14/symfony-bench-des-orm-propel-et-doctrine/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Connexion persistente du client SOAP PHP à travers une session</title>
		<link>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session</link>
		<comments>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session#comments</comments>
		<pubDate>Fri, 15 Feb 2008 19:35:36 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session</guid>
		<description><![CDATA[Pour mon boulot, j&#8217;ai besoin de mettre un objet en session qui contient lui-même un objet SoapClient. le problème, c&#8217;est que sur la page suivante, la connexion au serveur SOAP est coupée. Il faut reconnecter le client à la main&#8230; c&#8217;est un peu casse pied. Du coup, j&#8217;ai étendu la classe SoapClient pour que ca [...]]]></description>
			<content:encoded><![CDATA[<p>Pour <a href="http://www.digitick.com" target="_blank">mon boulot</a>, j&#8217;ai besoin de mettre un objet en session qui contient lui-même un objet <a href="http://php.net/soap" target="_blank">SoapClient</a>. le problème, c&#8217;est que sur la page suivante, la connexion au serveur SOAP est coupée. Il faut reconnecter le client à la main&#8230; c&#8217;est un peu casse pied.</p>
<p>Du coup, j&#8217;ai étendu la classe SoapClient pour que ca se reconnecte automatiquement et ca donne:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="kw2">class</span> SoapClientSessionnable <span class="kw2">extends</span> SoapClient <span class="br0">&#123;</span>
    <span class="kw2">private</span> <span class="re0">$wsdl</span><span class="sy0">;</span>
    <span class="kw2">private</span> <span class="re0">$options</span><span class="sy0">;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> __construct<span class="br0">&#40;</span><span class="re0">$wsdl</span><span class="sy0">,</span> <span class="re0">$options</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">wsdl</span>     <span class="sy0">=</span> <span class="re0">$wsdl</span><span class="sy0">;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">options</span>  <span class="sy0">=</span> <span class="re0">$options</span><span class="sy0">;</span>
&nbsp;
        parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="re0">$wsdl</span><span class="sy0">,</span> <span class="re0">$options</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="kw2">public</span> <span class="kw2">function</span> __wakeup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="re0">$this</span><span class="sy0">-&gt;</span>__construct<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">wsdl</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">options</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


<p>Bon, c&#8217;est un peu crade de rappeler le constructeur, mais je n&#8217;ai trouvé aucune méthode qui connecte le client SOAP&#8230; et puis ca a le mérite de fonctionner :)</p>
<p>Du coup, ca s&#8217;utilise de la même façon que le client SOAP de base:</p>


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="php"><pre class="de1"><span class="re0">$client</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapClientSessionnable<span class="br0">&#40;</span>
    <span class="st_h">'http://host.com/path/to/wsdl'</span><span class="sy0">,</span>
    <span class="kw3">array</span><span class="br0">&#40;</span>
        <span class="co1">// Options</span>
        <span class="st_h">'trace'</span>         <span class="sy0">=&gt;</span> <span class="nu0">1</span><span class="sy0">,</span>
        <span class="st_h">'soap_version'</span>  <span class="sy0">=&gt;</span> SOAP_1_1<span class="sy0">,</span>
        <span class="sy0">....</span>
    <span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div>


<p>Pensez quand même à mettre $client en session pour qu&#8217;il soit réutilisable dans la page suivante :)</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2008/02/15/connexion-persistente-du-client-soap-php-a-travers-une-session/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Envoyer des mails depuis PHP avec Ubuntu et esmtp !</title>
		<link>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp#comments</comments>
		<pubDate>Tue, 27 Nov 2007 16:38:29 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[planet ubuntu-fr]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp</guid>
		<description><![CDATA[J&#8217;ai actuellement un projet de site web qui a besoin d&#8217;envoyer un mail&#8230; rien de bien extraordinaire en fait. Mais envoyer un mail depuis PHP sur une station Ubuntu est moins facile qu&#8217;il n&#8217;y parait. 1ère solution: installer Postfix ou Sendmail, 2 gros bazookas pour une petite mouche. 2ème solution: installer nullmailer ou installer esmtp. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/mail.jpg" alt="Mail" />J&#8217;ai actuellement un projet de site web qui a besoin d&#8217;envoyer un mail&#8230; rien de bien extraordinaire en fait. Mais envoyer un mail depuis PHP sur une station Ubuntu est moins facile qu&#8217;il n&#8217;y parait.</p>
<p>1ère solution: installer Postfix ou Sendmail, 2 gros bazookas pour une petite mouche.</p>
<p>2ème solution: <a href="http://www.thierryb.net/site/Nullmailer-envoyer-mails-PHP-Linux.html" target="_blank">installer nullmailer</a> ou installer <a href="http://esmtp.sourceforge.net/" target="_blank">esmtp</a>. Chez moi, <a href="http://untroubled.org/nullmailer/" target="_blank">nullmailer</a> ne marchant pas pour des raisons obscures et sombres, j&#8217;ai installé esmtp qui fonctionne à merveille.</p>
<p>Installation:<br />
<code>sudo apt-get install esmtp</code></p>
<p>Configuration:<br />
<code>sudo vim /etc/esmtprc</code></p>
<p>Il suffit d&#8217;indiquer un serveur smtp (celui de son FAI, par exemple), éventuellement un login/pass au besoin.</p>
<p>Pour l&#8217;utiliser avec gmail, en revanche, c&#8217;est un poil plus complexe, mais <a href="http://esmtp.sourceforge.net/manual.html#interfacing-with-particular-mail-servers" target="_blank">la documentation d&#8217;esmtp</a> est bien faite.</p>
<p>Enfin, pour terminer, il suffit de faire un lien symbolique de /usr/bin/sendmail vers esmtp comme suit pour que tout fonctionne parfaitement:<br />
<code>sudo ln -s /usr/bin/esmtp /usr/bin/sendmail</code></p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/11/27/envoyer-des-mails-depuis-php-avec-ubuntu-et-esmtp/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Frameworks PHP</title>
		<link>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php#comments</comments>
		<pubDate>Tue, 22 May 2007 09:03:00 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://tg.mattlab.info/?p=12</guid>
		<description><![CDATA[Moi qui ne jurais que sur le Zend Framework depuis sa toute première version beta, alors que la communauté française se créait petit à petit et, enfin, alors que la version finale ne va pas tarder à pointer le bout de son nez (la 0.9.3 est sorti il y a peu de temps), voilà que [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/php.gif" alt="php" />Moi qui ne jurais que sur le <a hreflang="en" href="http://framework.zend.com/">Zend Framework</a> depuis sa toute première version beta, alors que <a hreflang="fr" href="http://www.z-f.fr/">la communauté française</a> se créait petit à petit et, enfin, alors que la version finale ne va pas tarder à pointer le bout de son nez (la 0.9.3 est sorti il y a peu de temps), voilà que je m&#8217;intéresse aux autres framework php.  J&#8217;ai regardé un peu ce que je trouvais et qui répondait au doux nom de <em>framework php</em> et j&#8217;en ai trouvé plein. Voici les <em>principaux</em> par ordre alphabétique:</p>
<ul>
<li><a hreflang="en" href="http://cakephp.org/">CakePHP</a>, dont les numéros de version à rallonge sont une source de franche poilade pour tout mon boulot (la dernière version stable est la 1.1.15.5144). J&#8217;avais essayé, il y a quelques mois, de dompter la bête&#8230; sans succès.</li>
<li><a hreflang="en" href="http://codeigniter.com/">CodeIgniter</a>, comme CakePHP, j&#8217;avais essayé, sans succès, de comprendre ce framework.</li>
<li><a hreflang="fr" href="http://www.jelix.org/">Jelix</a>, lancé par Laurent Jouanneau, un framework français qui à l&#8217;air plutot interressant mais dont la documentation est pauvre et incomplète alors que la version 1.0 beta2.1 vient de sortir.</li>
<li><a hreflang="en" href="http://www.symfony-project.com/">Symfony</a>, développé par une société française&#8230; en anglais. la communauté est assez grande. Tout comme ses camarades CakePHP et CodeIgniter, impossible de comprendre quoi que ce soit à ce framework il y a quelques mois.</li>
<li><a hreflang="en" href="http://www.phpontrax.com/">PHP On Trax</a>, développé dans l&#8217;optique de faire un <a hreflang="en" href="http://www.rubyonrails.com/">Ruby On Rails</a> avec PHP.</li>
<li><a hreflang="en" href="http://seagull.phpkitchen.com/">Seagull</a>, non testé</li>
<li><a hreflang="en" href="http://framework.zend.com/">Zend Framework</a>, développé par <a hreflang="en" href="http://www.zend.com/">Zend</a>, <em>The PHP Company</em>.</li>
<li>Pleins d&#8217;autres&#8230;</li>
</ul>
<p>Je n&#8217;ai pas du tout testé Jelix à cause de sa documentation à trou. PHP On Trax non plus: je n&#8217;aime pas <acronym title="Ruby On Rails">RoR</acronym>, il y a peu de chance pour que PHP On Trax me plaise. Pas plus pour Seagull dont le nom ne m&#8217;attire pas (oui, je sais c&#8217;est pas une excuse valable&#8230; et pourtant). CakePHP, CodeIgniter et Symfony m&#8217;ont paru beaucoup trop obscurs, même leurs tutoriels <em>mon blog en 5 minutes</em> ne me convainquaient pas Quant à Zend Framework, je me suis plongé dedans aussitôt, j&#8217;ai aimé, j&#8217;ai développé des applications avec, y compris à mon boulot&#8230; et pourtant.</p>
<h3>Le gros défaut de Zend Framework</h3>
<p>Zend Framework est aux Framework PHP ce que PHP est aux langages de programmation. C&#8217;est simple, il y a une excellente documentation, une grande communauté et&#8230; on peut faire tout et n&#8217;importe quoi. De la même manière qu&#8217;on peut coder comme un porc ou comme un dieu avec PHP, on peut utiliser le <acronym title="Zend Framework">ZF</acronym> comme PEAR en utilisant des bibliothèques par ci, par là, on peut suivre ou non l&#8217;architecture proposée par Zend, on peut utiliser le concept <acronym title="Model View Controller">MVC</acronym> ou pas. Bref, le ZF est, tout comme PHP, beaucoup trop permissif pour un framework. Au final, on peut très vite se retrouver avec un site qui n&#8217;est pas du tout facile à maintenir, un comble pour un framework.</p>
<h3>Alors on utilise quoi?</h3>
<p>Je ne saurais rien imposer. Mais après moult tests et avec de l&#8217;acharnement, je pense avoir trouver mon bonheur avec Symfony. Le gros problème de Symfony, c&#8217;est son tutoriel de prise en main qui m&#8217;a fait fuir alors que le framework lui-même est une perle car, et ça se sent, il répond exactement à bon nombre de problématiques que l&#8217;on peut rencontrer dans des applications Web professionnelles. En lisant la <a hreflang="en" href="http://www.symfony-project.com/book/trunk">documentation de Symfony</a><sup>[<a id="rev-pnote-811-1" href="#pnote-811-1">1</a>]</sup> (je n&#8217;ai pas fini, j&#8217;en suis au chapitre 9), j&#8217;ai rencontré des solutions à des problèmes que l&#8217;on rencontre à mon boulot. ce qui n&#8217;était pas le cas avec ZF où il fallait au contraire créer tout un tas de plugins ou d&#8217;helpers.</p>
<h3>SF remplace ZF ?</h3>
<p>Oui. Je projette de migrer vers Symfony l&#8217;application que j&#8217;ai commencé sur ZF au boulot (sur mon temps libre, sinon mon patron va me tuer) Je compte aussi commencer la traduction en français du manuel de <acronym title="Symfony">SF</acronym>.</p>
<p class="footnotes">
<h4>Notes</h4>
<p>[<a id="pnote-811-1" href="#rev-pnote-811-1">1</a>] Que ceux qui disaient que je ne lisais pas l&#8217;anglais remarque bien que l&#8217;intégralité de ce manuel est en anglais et qu&#8217;il n&#8217;en existe pas de version française</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/05/22/frameworks-php/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>date(&#8216;d/m/Y&#8217;, strtotime(&#8217;0000-00-00&#8242;)) = ?</title>
		<link>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00</link>
		<comments>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00#comments</comments>
		<pubDate>Thu, 10 May 2007 23:22:00 +0000</pubDate>
		<dc:creator>Renaud</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[planet libre]]></category>

		<guid isPermaLink="false">http://tg.mattlab.info/?p=8</guid>
		<description><![CDATA[Allez, allez! Petite énigme de fin de semaine! D&#8217;après vous, en PHP, que peut bien retourner date('d/m/Y', strtotime('0000-00-00')), hein ? Moi, au début, je pensais que ça allait me sortir EPOCH, donc quelque chose qui aurait dû ressembler à 01/01/1970. Que nenni! Cela affiche 30/11/1999. Ah&#8230; il a fallu chercher&#8230; et une fois trouvé, c&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://totalement.geek.oupas.fr/wp-content/uploads/2007/12/php.gif" alt="php" />Allez, allez! Petite énigme de fin de semaine!</p>
<p>D&#8217;après vous, en <a hreflang="en" href="http://www.php.net">PHP</a>, que peut bien retourner<br />
<code>date('d/m/Y', strtotime('0000-00-00'))</code>, hein ?</p>
<p>Moi, au début, je pensais que ça allait me sortir <a hreflang="fr" href="http://fr.wikipedia.org/wiki/Epoch">EPOCH</a>, donc quelque chose qui aurait dû ressembler à 01/01/1970.</p>
<p>Que nenni! Cela affiche 30/11/1999.</p>
<p>Ah&#8230; il a fallu chercher&#8230; et une fois trouvé, c&#8217;est tout à fait logique.</p>
<p>Cela part d&#8217;un <a hreflang="en" href="http://bugs.php.net/bug.php?id=30190">bug PHP</a><sup>[<a id="rev-pnote-795-1" href="#pnote-795-1">1</a>]</sup> du parser de PHP qui ne fait aucune différence entre l&#8217;année &#8217;0&#8242;, &#8217;00&#8242;, &#8217;000&#8242; ou &#8217;0000&#8242; et qu&#8217;il traduit inévitablement en l&#8217;an 2000. A partir de là, dans la gymnastique <em>microprocessoromentale</em> de PHP, il se passe les choses suivantes:</p>
<ul>
<li>0000-00-00 devient 2000-00-00</li>
<li>2000-00-00 n&#8217;existe pas, il prend le 00 du mois et décide donc que c&#8217;est le mois précédent: 1999-12-00<sup>[<a id="rev-pnote-795-2" href="#pnote-795-2">2</a>]</sup></li>
<li>1999-12-00 n&#8217;existe pas, il prend le 00 du jour et décide que c&#8217;est le jour précédent: 1999-11-30<sup>[<a id="rev-pnote-795-3" href="#pnote-795-3">3</a>]</sup></li>
</ul>
<p>Nous voila donc propulsé fin novembre 1999.</p>
<p><strong>Conclusion:</strong></p>
<ul>
<li>il vaut mieux avoir NULL plutôt que &#8217;0000-00-00&#8242; pour une date non utilisée</li>
<li>pour avoir rapidement la fin d&#8217;un mois, il suffit de se mettre au jour 00 du mois suivant. Exemple: si on veut le 31 aout 2010, il suffit d&#8217;avoir &#8217;2010-09-00&#8242;, strtotime se chargera de revenir un jour en arrière.</li>
</ul>
<p class="footnotes">
<h4>Notes</h4>
<p>[<a id="pnote-795-1" href="#rev-pnote-795-1">1</a>] Contrairement à ce qui est écrit dans le rapport de bugs et ses commentaires, le bug existe toujours en PHP5</p>
<p>[<a id="pnote-795-2" href="#rev-pnote-795-2">2</a>] De la même manière, si vous aviez le mois 13, il passerait à janvier de l&#8217;année suivante</p>
<p>[<a id="pnote-795-3" href="#rev-pnote-795-3">3</a>] De la même manière, si vous aviez le 32 janvier, il passerait au 1er févier et si c&#8217;était le 40 janvier, vous arriveriez au 9 février.</p>
]]></content:encoded>
			<wfw:commentRss>http://totalement.geek.oupas.fr/article/2007/05/10/datedmy-strtotime0000-00-00/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

