<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Ziki - Julien CROUZET's last published content</title>
    <link>http://www.ziki.com/en/juliencrouzet+84271</link>
    <pubDate>Thu, 01 Jul 2010 21:38:12 +0200</pubDate>
    <ttl>120</ttl>
    <description>My aggregated content at ziki.com</description>
    <item>
      <title>Quelques liens sympas &#8230;</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/MOHSVvfZgyU/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 221px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2010/07/links.jpg"><img title="links" src="http://blog.juliencrouzet.fr/wp-content/uploads/2010/07/links.jpg" height="138" alt="" width="211" /></a>
  <p>
    Du lien frais (ou pas)
  </p>
</div>
<p>
  Quelques liens sympas concernant le développement Web :
</p>
<ul>
  <li>
    <a href="http://www.gscottolson.com/blackbirdjs/">Blackbird</a> – alert(), c’est dépassé, la console de Firebug, c’est bien ; mais il y a mieux ! Blackbird est une console <strong>très</strong> sympa de logging Javascript qui s’active / désactive avec clavier, se déplace, etc… ;
  </li>
  <li>
    <a href="http://demo.tutorialzine.com/2009/10/cool-login-system-php-jquery/demo.php">Une idée</a> sympa de système de login avec un panneau qui slide ;
  </li>
  <li>
    <a href="http://css3generator.com/">Un générateur</a> de règles CSS3 ;
  </li>
  <li>
    <a href="http://redmine.lighttpd.net/wiki/1/AbsoLUAtion">Une collection</a> de scripts LUA pour Lighttpd pour tout type de problèmes, de quoi rendre Lighty le rapide aussi complet que le gros apache bien lent <img src="http://blog.juliencrouzet.fr/wp-includes/images/smilies/icon_smile.gif" alt=":)" /> ;
  </li>
  <li>
    <a href="http://digitalbush.com/projects/masked-input-plugin/#demo">Un plugin jQuery</a> pour faire des &lt;input&gt; avec des masques de format.
  </li>
</ul>
<p>
  Bonne lecture !
</p>
</div>]]>
      </description>
      <pubDate>Thu, 01 Jul 2010 21:38:12 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2010:/article/12620618</guid>
    </item>
    <item>
      <title>Zoom sur les m&#233;thodes magiques de PHP</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/eRkk_BLrV2M/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 150px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2010/06/025-magician-01.png"><img title="025-magician-01" src="http://blog.juliencrouzet.fr/wp-content/uploads/2010/06/025-magician-01.png" height="140" alt="" width="140" /></a>
  <p>
    Abracadabra...
  </p>
</div>
<p style="text-align: center;"></p>
<p>
  Les objets en PHP possèdent 14 méthodes « magiques », reconnaissables à leurs noms qui commencent par deux <em>underscores</em> « __ » : __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state, __clone.
</p>
<p>
  Une méthode « magique » en PHP, c’est une méthode dont le nom est réservé (vous ne pouvez pas utiliser ces noms pour appeler vos propres méthodes, d’une manière générale, ne nommez jamais une méthode avec un nom qui commence par « __ »), que le moteur PHP va tenter d’appeler dans lors de certains évènements propres à votre classe si celles-ci existe.
</p>
<p>
  Par exemple, si vous avez une méthode appelée « __construct » dans votre classe, celle-ci sera appelée lorsque l’on instancie une instance de votre classe : <em>new MaClasse().</em>
</p>
<p>
  Dans la plupart des cas (sauf si précisé), ces méthodes doivent être définie comme publique et non statiques (ex : <em>public function __construct()</em>).
</p>
<p>
  Voyons-les en détails …
</p>
<p>
  <span></span><br />
</p>
<h3>
  __construct
</h3>
<p>
  La plus connue d’entre elles ; beaucoup l’utilisent sans savoir qu’il s’agit d’une méthode « magique ». __construct est ce qui s’apparente à un constructeur en C++, c’est-à-dire qu’elle est appelée à chaque instanciation de votre objet. Par exemple, si j’appelle <em>new MaClasse(</em><code><em>"test"</em></code><em>, 5 ) ;</em>, la méthode __construct de MaClasse va être appelée avec comme argument <code>"test"</code> et 5. Il est inutile de retourner une valeur dans cette méthode, ce retour serait ignoré.
</p>
<p>
  Par convention, on place dans la méthode __construct toutes les initialisations nécessaires à l’utilisation d’un objet, comme par exemple la connexion à une base de données, les valeurs par défaut des variables, etc.
</p>
<p>
  A noter qu’en cas d’instanciation d’une classe fille (qui hérite de la classe), __construct ne sera pas appelé, si la classe fille (ou une des classe dans l’héritage) implémente une fonction __construct ; il faudra alors appeler <em>parent::__construct(…)</em> dans la méthode __construct de cette classe fille.
</p>
<h3>
  __destruct
</h3>
<p>
  __destruct est appelé lorsque qu’une instance de notre classe est détruite (elle n’est plus utilisée, ou la fin du script est arrivée par exemple), elle n’a aucun argument.
</p>
<p>
  A l’inverse de __construct, on place dans cette méthode tout ce qui est nécessaire à la fin de vie de notre objet, comme par exemple la déconnexion d’une socket, la libération de mémoire cache, etc.
</p>
<p>
  Attention, l’utilisation de cette méthode est souvent très sensible :
</p>
<ul>
  <li>Souvent, celle-ci est appelée en fin de script, c’est-à-dire à un moment ou les en-têtes (headers) sont déjà envoyés ;
  </li>
  <li>Si une exception est levée pendant l’exécution de cette méthode, une erreur fatale PHP est levée et le reste (de la fin) du script ne sera pas exécuté ;
  </li>
  <li>Beaucoup de ressources (instances d’autres classes, connexion à des bases de données) dont probablement déjà plus disponibles.
  </li>
</ul>
<h3>
  __call
</h3>
<p>
  __call est appelé lorsque l’on essaye d’appeler une méthode qui n’existe pas dans la classe. Par exemple, si j’essayer d’appeler <em>$objet-&gt;fooBar(</em><code><em>"test"</em></code><em>, 5) ;</em> que <em>fooBar</em> n’est pas une méthode définie dans ma classe et que j’ai une méthode __call définie, celle-ci va être appelée avec comme arguments <code><em>"fooBar"</em></code> <code>(</code>le nom de la méthode appelée) et un tableau contenant <code><em>"test"</em></code> et <em>5</em> (les arguments).
</p>
<h3>
  __callStatic
</h3>
<p>
  __callStatic fait la même chose que __call, mais est appelée lorsque l’on essaye d’appeler une méthode statique qui n’existe pas ; par exemple <em>MaClasse::fooBar(</em><code><em>"test"</em></code><em>, 5) ;</em> appellera __callStatic avec comme arguments <code><em>"fooBar"</em></code> <code>(</code>le nom de la méthode appelée) et un tableau contenant <code><em>"test"</em></code> et <em>5</em> (les arguments).
</p>
<p>
  Attention, comme callStatic est appelé dans un contexte statique, il faut définir la méthode de manière publique et statique (<em>public static function __callStatic($name, $args) {</em> ).
</p>
<h3>
  __set
</h3>
<p>
  __set est appelé lorsque l’on essaye de définir une propriété qui n’existe pas.
</p>
<p>
  Par exemple <em>$object-&gt;fooBar = 5;</em> appellera __set avec comme arguments <code><em>"fooBar"</em></code> <code>(</code>le nom de la propriété) et un <em>5</em> (la nouvelle valeur). Cependant, cette propriété ne sera pas créée pour autant !
</p>
<p>
  A noter que __set est appelée lorsque l’on essaye de modifier la valeur d’une propriété privée ou protégée depuis l’extérieur de la classe.
</p>
<h3>
  __get
</h3>
<p>
  __get est appelé lorsque l’on essaye de récupérer la valeur d’une propriété qui n’existe pas.
</p>
<p>
  Par exemple echo <em>$object-&gt;fooBar;</em> appellera __get avec comme argument <code><em>"fooBar"</em></code>. La valeur alors retournée par la méthode __get sera retournée à l’appel (<em>echo</em> dans l’exemple).
</p>
<p>
  A noter que __get est appelée lorsque l’on essaye de récupérer la valeur d’une propriété privée ou protégée depuis l’extérieur de la classe.
</p>
<h3>
  __isset
</h3>
<p>
  __isset est appelé lorsque l’on essaye de savoir si une propriété qui n’existe pas est définie, avec <em>isset()</em> par exemple.
</p>
<p>
  Par exemple isset(<em>$object-&gt;fooBar)</em> appellera __isset avec comme argument <code><em>"fooBar"</em></code>. La valeur alors retournée par la méthode __get sera retournée à l’appel, celle-ci doit donc de préférence retourner <em>true</em> ou <em>false</em>.
</p>
<p>
  A noter que __isset est appelée lorsque l’on essaye de savoir si la valeur d’une propriété privée ou protégée est définie depuis l’extérieur de la classe.
</p>
<h3>
  __unset
</h3>
<p>
  __unset fait à peu près la même chose que __isset, donc vous avez tout deviné … J
</p>
<p>
  <strong>__sleep et __wakeup</strong>
</p>
<p>
  Ces anciennes méthodes permettent de linéariser et délinéariser des objets d’une classe. La linéarisation permet à un objet d’être enregistré (comme par exemple dans une base de données ou une mémoire cache) dans un état défini (comprendre les valeurs des méthodes par exemple). Ceci peut être très utile par exemple si l’on veut enregistrer un objet de session.
</p>
<p>
  Par défaut, les objets linéarisés le sont à l’aide de la fonction serialize() de PHP, mais cela peut s’avérer insuffisant, comme par exemple si l’on doit avant se déconnecter d’une base de données ou faire du nettoyage.
</p>
<p>
  Deux méthodes magiques existent pour cela, __sleep et __wakeup, mais il est fortement déconseillé de les utiliser car il est impossible alors d’accéder au nom des propriétés privées ou protégées des classes parentes, il faut alors utiliser l’interface Serializable. Ce n’est pas une méthode magique, mais elle les « remplace », je vais donc en parler ici.
</p>
<p>
  Serializable définit deux méthodes : serialize et unserialize :
</p>
<ul>
  <li>serialize() est appelé lorsque l’on appelle la fonction PHP <em>serialize($objet)</em> ;. Elle doit alors retourner une chaîne qui pourra être récupérée pour réinitialiser l’objet dans l’état actuel ;
  </li>
  <li>unserialize($string) est appelé lorsque l’on appelle la fonction PHP $object = <em>unserialize($string)</em> ;. Elle doit alors récupérer la chaîne $string pour réinitialiser l’objet dans l’état décrit par celle-ci. Dans ce cas, $object sera alors une instance de la classe réinitialisé, mais <em>__construct()</em> ne sera pas appelé. Elle doit modifier l’objet mais ne rien retourner (comme __construct).
  </li>
</ul>
<p>
  Voici un exemple de classe pour être plus clair :
</p>
<pre name="code">
/**
 * Classe mere
 */
class          Compteur {
  /**
   * Somme
   *
   * @var  int
   */
  protected      $_sum;
}
/**
 * Une classe tout bête qui compte le nombre de fois
 * qu'on l'a appelée et fait une somme
 */
class          CompteurBete extends Compteur implements Serializable {
  /**
   * Nombre de fois qu'on l'a appellé
   *
   * @var  int
   */
  private        $_calls;  

  /**
   * Constructeur
   */
  public function    __construct() {
    $this-&gt;_sum = 0;
    $this-&gt;_calls = 0;
    echo "Constructeur appellé !\n";
  }
  /**
   * On ajoute un nombre a la somme
   *
   * @param  int      Nombre
   */
  public function      add($number) {
    $this-&gt;_sum += intval($number);
    $this-&gt;_calls++;
  }
  /**
   * Quelle est la somme ?
   *
   * @return  int
   */
  public function      getSum() {
    return($this-&gt;_sum);
  }
  /**
   * Combien de fois ai-je été appelé
   *
   * @return  int
   */
  public function      getCalls() {
    return($this-&gt;_calls);
  }
  /**
   * La méthode qui fait la sérialisation
   *
   * @return  string    Chaîne qui représente l'état de l'objet
   */
  public function      serialize() {
    return("{$this-&gt;_sum}|{$this-&gt;_calls}");
  }
  /**
   * La méthode qui réinitialise l'objet dans l'état sérialisé
   *
   * @param  string    Chaîne retournée par serialize()
   */
  public function      unserialize($serialized) {
    if (preg_match("/^([\-\d]+)\|([\-\d]+)$/", $serialized, $parts)) {
      $this-&gt;_sum = intval($parts[1]);
      $this-&gt;_calls = intval($parts[2]);
    } else {
      throw new Exception("La chaîne ne représente pas une instance de CompteurBete : " . $serialized);
    }
  }
}
</pre>
<p>
  Si on exécute le code suivant :
</p>
<pre name="code">
/**
 * On cree notre objet
 */
$object = new CompteurBete();
/**
 * On joue avec
 */
$object-&gt;add(5);
$object-&gt;add(10);
$object-&gt;add(-25);
/**
 * On le serialize
 */
$serialized = serialize($object);

echo "Nombre d'appels : " . $object-&gt;getCalls() . "\n";
echo "Somme : " . $object-&gt;getSum() . "\n";
echo "Chaîne sérialisée : " . $serialized . "\n";
</pre>
<p>
  On obtient le résultat :
</p>
<pre name="code">
Constructeur appellé !
Nombre d'appels : 3
Somme : -10
Chaîne sérialisée : C:12:"CompteurBete":5:{-10|3}
</pre>
<p>
  La chaîne « <em>C:12:&nbsp;»CompteurBete&nbsp;»:5:{-10|3}</em> » peut être traduite par « Une instance de la classe «&nbsp;CompteurBete&nbsp;» que l’on peut désérialiser avec la chaîne «&nbsp;{-10|3}&nbsp;» ».
</p>
<p>
  Donc si l’on exécute maintenant le code :
</p>
<pre name="code">
/**
 * On passe la chaîne récupérée
 */
$newObject = unserialize('C:12:"CompteurBete":5:{-10|3}');
echo "Nombre d'appels : " . $object-&gt;getCalls() . "\n";
echo "Somme : " . $object-&gt;getSum() . "\n";
</pre>
<p>
  On obtient :
</p>
<pre name="code">
Nombre d'appels : 3
Somme : -10
Magnifique ! Le même résultat ! Notre objet est donc bien réinitialisé !
</pre>
<p>
  Vous noterez que j’ai « implémenté » un système maison de sérialisation/désérialisation maison mais il est souvent préférable de se baser sur des systèmes tels que <em>serialize()/unserialize()</em> de PHP…
</p>
<h3>
  __toString
</h3>
<p>
  __toString est appelé lorsque l’on essaye d’utiliser une classe comme une chaîne de caractères, par exemple lorsque l’on appelle <em>echo $object ;</em>.La méthode __toString est alors appelée, sans argument, et doit retourner une chaîne qui sera à son tour retournée à l’appelant.
</p>
<p>
  C’est très utile lorsque l’on crée des classes qui représentent des balises HTML, on peut alors travailler avec ces classes avec des appels du type :
</p>
<pre name="code">
$tag = new HTMLTag('ul');
$tag-&gt;setClass('maClasse')-&gt;setId('monId')-&gt;html('Hello');
echo $tag;  // Va afficher
</pre>
<div style="margin-left: 2em;">
  Hello
</div>
<pre>

</pre>
<h3>
  __invoke
</h3>
<p>
  __invoke est appelé lorsque l’on essaye d’appeler un objet comme une fonction. Par exemple, si l’on effectue <em>$object(«&nbsp;buuum&nbsp;») ;</em>, la méthode __invoke va être appelée avec comme argument <em>«&nbsp;buuum&nbsp;»</em>.
</p>
<p>
  Cela peut être utile notamment lorsque l’on souhaite utiliser une fonction de PHP qui utilise une fonction comme argument, comme <em>usort()</em>, à laquelle on peut passer comme argument l’objet.
</p>
<p>
  A noter, pour tester si une instance d’une classe implémente __invoke, on peut utiliser <em>is_callable()</em>.
</p>
<h3>
  __set_state
</h3>
<p>
  __set_state est un peu complexe à définir, et à mon avis pas très utile, mais essayons quand même. Pour comprendre __set_state, il faut d’abord connaitre la fonction PHP <em>var_export()</em>.<em>var_export()</em> c’est le même principe que <em>var_dump()</em>, c’est-à-dire afficher des informations sur une variable, mais avec deux différences :
</p>
<ul>
  <li>· var_export peut retourner les infos plutôt que de les afficher si on précise <em>true</em> en deuxième argument ;
  </li>
  <li>· var_export retourne du code PHP valide.
  </li>
</ul>
<p>
  Si l’on prend le code suivant par exemple :
</p>
<pre name="code">
$number = 5;
$string = "ouech";
$array = array(1, "t'as vu", false);
class test {
  public        $property = 5;
  private        $_property = "ok";
  public function    method() { /**/ }
}
$object = new test();
echo var_export($number) . "\n";
echo var_export($string) . "\n";
echo var_export($array) . "\n";
echo var_export($object) . "\n";
</pre>
<p>
  On obtient le résultat suivant :
</p>
<pre name="code">
5
'ouech'
array (
  0 =&gt; 1,
  1 =&gt; 't\'as vu',
  2 =&gt; false,
)
test::__set_state(array(
  'property' =&gt; 5,
  '_property' =&gt; 'ok',
))
</pre>
<p>
  Penchons-nous donc sur le dernier résultat, concernant l’objet. <em>var_export()</em> retourne un code qui est un appel à une méthode __set_state sur la classe <em>test</em>. On y est dont, à cette méthode.
</p>
<p>
  En fait, cette méthode prend en argument un tableau qui représente la liste des propriétés de l’instance de la classe. La méthode doit normalement récupérer créer une instance de la classe, assigner les propriétés récupérées et retourner cet objet, afin de pouvoir faire quelque chose comme <em>eval(‘$newInstance =’ . var_export($oldInstance, true) . ‘;’) ;</em>
</p>
<p>
  Donc :
</p>
<ul>
  <li>· La méthode __set_state est une méthode publique statique, on a donc pas accès aux propriétés protégées et publique de l’objet qu’on doit réinitialiser, il faut donc faire des méthodes « setter » ;
  </li>
  <li>· C’est ignoble, immonde et lent comme code (et oui eval()…) ;
  </li>
  <li>· C’est pas très sécurisé, voire pas du tout (et oui eval()…) ;
  </li>
  <li>· La méthode peut en fait faire n’importe quoi et retourner n’importe quoi…
  </li>
</ul>
<p>
  Si quelqu’un à compris quelle est l’utilité de __set_state, donc, qu’il se manifeste !
</p>
<h3>
  __clone
</h3>
<p>
  __clone est appelé lorsque l’on souhaite cloner une instance de la classe avec la fonction PHP <em>clone()</em>. En effet, on peut dans certains cas vouloir contrôler le clonage d’une instance de notre classe pour par exemple partager des ressources (base de données, etc.), voir l’empecher.
</p>
<p>
  Lorsque l’on appelle clone() sur un objet et que la méthode __clone est implémentée, celle-ci sera invoquée alors sur le nouvel objet cloné juste après sa création.
</p>
</div>]]>
      </description>
      <pubDate>Wed, 23 Jun 2010 03:03:11 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2010:/article/12586573</guid>
    </item>
    <item>
      <title>Rendez vos textarea sexy avec tx-content-assist</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/FeSbP_KWgtw/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 290px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2010/06/2010-06-22_1558.png"><img title="tx-content-assist" src="http://blog.juliencrouzet.fr/wp-content/uploads/2010/06/2010-06-22_1558.png" height="113" alt="" width="280" /></a>
  <p>
    Classe !
  </p>
</div>
<p style="text-align: left;"></p>
<p style="text-align: left;">
  Pouvoir faire de la complétion dans un &lt;textarea&gt;, c’est possible, avec <a href="http://github.com/sergeche/tx-content-assist/">tx-content-assist</a>, c’est possible !
</p>
<p style="text-align: left;">
  C’est en fait une réécriture du moteur d’assistance de code de Eclipse, et c’est même possible de le déclencher avec «&nbsp;Ctrl+Espace&nbsp;» / «&nbsp;Alt + Espace&nbsp;» (enfin, certains navigateurs l’ont déjà reservé).
</p>
<p style="text-align: left;">
  Pour une petite démo, c’est par <a href="http://media.chikuyonok.ru/content-assist/">ici</a>, pour les sources, c’est sur <a href="http://github.com/sergeche/tx-content-assist/">github</a>.
</p>
</div>]]>
      </description>
      <pubDate>Tue, 22 Jun 2010 16:02:28 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2010:/article/12582009</guid>
    </item>
    <item>
      <title>Back again ?</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/63pqTz6rY14/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Une fois n’est pas coutume, je n’avait plus mis à jour ce blog depuis longtemps.
</p>
<p>
  Me&nbsp;revoilà, donc, avec un nouveau design !
</p>
</div>]]>
      </description>
      <pubDate>Tue, 18 May 2010 07:13:09 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2010:/article/12582010</guid>
    </item>
    <item>
      <title>SketchPad : L'outil de dessin / graphiques online garanti sans flash !</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/bD4uopaKmIE/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 312px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2010/02/noflash.png"><img title="No Flash" src="http://blog.juliencrouzet.fr/wp-content/uploads/2010/02/noflash-300x86.png" height="86" alt="Pas de flash, pas de chocolat" width="302" /></a>
  <p>
    Pas de flash, pas de chocolat
  </p>
</div>
<p>
  Futurs possesseurs de l’iPad, farouches combattant du Flash, vous voulez vous aussi pouvoir utiliser un outil de dessin On Line ?
</p>
<p>
  Alors voici <a href="http://mugtug.com/sketchpad/">SketchPad</a>, une application de dessin proche de <a href="https://www.photoshop.com/">Photoshop Express</a> et des autres outils d’online painting, mais avec un particularité : Il est développé en HTML5/Javascript. Tout est donc contrôlé via des <a href="https://developer.mozilla.org/en/Canvas_tutorial">Canvas</a>, vous n’avez donc pas besoin d’avoir Flash sur votre machine (mais un navigateur <a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28HTML5%29#Elements">compatible HTML5 qui supporte les Canvas</a>).
</p>
<p>
  Have fun !
</p>
</div>]]>
      </description>
      <pubDate>Wed, 10 Feb 2010 12:21:26 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2010:/article/12582011</guid>
    </item>
    <item>
      <title>Une vid&#233;o Youtube comme site Internet</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/qRmZ2ScqTa0/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 145px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/10/idea.jpg"><img title="idea" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/10/idea-300x225.jpg" height="102" alt="Une super idée !" width="135" /></a>
  <p>
    Une super idée !
  </p>
</div>
<p>
  Comment innover dans un milieu aussi rôdé que celui des sites Internet d’agence ? Avec un vidéo Youtube !
</p>
<p>
  Oui mais pas n’importe quelle vidéo, une vidéo interactive monté comme un site, rondement bien ficelée, autant niveau technique que niveau production.
</p>
<p>
  Cependant, même si l’idée est excellente et bien exécutée, il semblerait qu’ils n’utilisent <strong>QUE</strong> cette vidéo comme site, et là c’est très dangereux. Quid des clients qui ont Youtube bloqué sur leur proxy d’entreprise ? Ou du référencement ? Et si Youtube supprime la vidéo ?
</p>
<p>
  Quoi qu’il en soit le buzz est parti, et la vidéo, c’est ici :
</p>
<p>
  <a href="http://www.youtube.com/watch?v=Elo7WeIydh8">http://www.youtube.com/watch?v=Elo7WeIydh8</a>
</p>
<p>
  (Merci à Olivier pour l’info !)
</p>
</div>]]>
      </description>
      <pubDate>Sun, 04 Oct 2009 01:41:25 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582012</guid>
    </item>
    <item>
      <title>redis : Le syst&#232;me de cache parfait</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/t0WNY1cLSJw/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 171px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/bolt.jpg"><img title="bolt" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/bolt-300x243.jpg" height="131" alt="Il les surpasse tous !" width="161" /></a>
  <p>
    Il les surpasse tous !
  </p>
</div>
<p>
  Après 3 ans d’une histoire d’amour fidèle avec <a href="http://www.danga.com/memcached/">Memcached</a> ; le serveur de cache notamment utilisé par <a href="http://www.facebook.com/note.php?note_id=39391378919">Facebook</a>, <a href="http://video.google.com/videoplay?docid=-6304964351441328559">Youtube</a> ou <a href="http://blog.twitter.com/2008/05/its-not-rocket-science-but-its-our-work.html">Twitter</a> ; je suis au bord de la rupture après avoir rencontré <a href="http://code.google.com/p/redis/">redis</a>.<br />
  <span></span>
</p>
<h2>
  redis, A persistent key-value <em>database</em>
</h2>
<p>
  Oui, <strong>database</strong>. En fait, redis, c’est les avantage d’un système de cache sans les inconvénients.
</p>
<p>
  D’habitude avec les systèmes de caches comme Memcached, les données mises en cache sont volatiles. Elles sont stockées en mémoire pendant un certain temps ; passé ce délais elles sont supprimées.
</p>
<p>
  Ce point n’est pas bloquant, une données mise en cache doit pouvoir être recalculée ou récupérée à tout moment, mais cela consomme des ressources en plus (pour récupérer cette donnée, justement).
</p>
<p>
  <a href="http://code.google.com/p/redis/">redis</a> est conçu sur un autre modèle. Les données sont dans un premier temps stockées en mémoire de la même manière que les autres, mais elles sont de manière cycliques (tout les X écritures ou après X temps) écrites sur le disque dur. On peut donc stocker une donnée de manière permanente !
</p>
<p>
  A noter cependant que Memcache existe en version persistante (<a href="http://memcachedb.org/">MemcachedDB</a>), cependant on il ne fait QUE du stockage persistant, on perd donc en performance.
</p>
<h2>
  Des performances impressionnantes
</h2>
<p>
  Afin de comparer les performances de Memcached, réputé et reconnu pour sa rapidité, et celles de redis, j’ai fait un simple test pour Memcache :
</p>
<p>
  Et pour redis :
</p>
<p>
  Résultat : Avec redis on est en moyenne à 2,507 secondes pour 10 000 itérations, pour Memcached on est à 3,669 secondes.
</p>
<p>
  redis est donc plus rapides que Memcached sur des opérations de bases (écriture, lecture) il fallait le faire !
</p>
<p>
  Sinon pour être un peu plus complet, une page de <a href="http://code.google.com/p/redis/wiki/Benchmarks">benchmark</a> est présente sur le site.
</p>
<h2>
  Au delà du stockage <em>«&nbsp;clé-chaîne&nbsp;»</em>
</h2>
<p>
  Un autre inconvénient de Memcached ou d’autres système de cache, c’est qu’il fonctionne sur un modèle «&nbsp;<em>clé-chaîne de caractère</em>«&nbsp;, il ne peut donc stocker que des combinaisons du type (‘clé de cache’, ‘valeur à stocker’).
</p>
<p>
  Lorsque l’on doit enregistrer des données plus complexes comme des tableaux, on est alors obligé de passer par une mécanique de <a href="http://fr.wikipedia.org/wiki/S%C3%A9rialisation">sérialisation des données ou Mashalling</a>, comme <a href="http://fr3.php.net/serialize">serialize</a>() en PHP.
</p>
<p>
  redis permet en plus du mode de stockage «&nbsp;<em>clé-chaîne</em>&nbsp;» un mode de stockage «&nbsp;<em>clé-liste</em>&nbsp;» qui permet de stocker des listes. Il est donc possible, au delà de stocker et récupérer des valeurs, d’utiliser les fonctions classiques de listes, comme changer une valeur dans cette liste, récupérer une valeur ou un ensemble de valeur dans la liste, la modifier etc. et ce sans avoir à récupérer la liste, la modifier et la renvoyer comme c’est le cas avec les autres systèmes.
</p>
<p>
  Ceci est un gain énorme de ressources système et de temps tout en simplifiant la gestion du cache !
</p>
<h2>
  Multiple bases de donnée
</h2>
<p>
  Un même serveur de cache peut être utilisé par plusieurs systèmes de cache. Souvent cela est problématique car les données ne sont pas séparées par application. On utilise alors souvent un système de préfixage des clés, par exemple la clé ‘UsersCount’ sera nommée ‘MyApplication_UsersCount’ pour éviter d’écraser une clé d’une autre application.
</p>
<p>
  redis offre une gestion par «&nbsp;base de donnée&nbsp;» comme le font les base de données classiques ; ce qui permet entre autre de vider le cache d’une application sans effacer les autres données ou de lister rapidement les données en cache d’une application donnée.
</p>
<h2>
  Implémentation langages
</h2>
<p>
  Pour utiliser redis il existe des libraries ou classe en Ruby, Python, PHP, Perl, Java, etc. ; la liste est présente sur le <a href="http://code.google.com/p/redis/">site du projet</a>.
</p>
</div>]]>
      </description>
      <pubDate>Sat, 29 Aug 2009 19:11:14 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582013</guid>
    </item>
    <item>
      <title>Microsoft assurera le support d&#8217;Internet Explorer 6 jusqu&#8217;en 2014</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/y4RxkxTwj6U/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 154px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/ie6-no-more.jpg"><img title="ie6-no-more" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/ie6-no-more.jpg" height="143" alt="IE6 ? No more !" width="144" /></a>
  <p>
    IE6 ? No more !
  </p>
</div>
<p>
  Après avoir hésité quelque temps, Microsoft à craqué face au lobby des D.S.I. aussi vieillissant que leur navigateur préféré : <a href="http://www.zdnet.fr/actualites/internet/0,39020774,39704568,00.htm">Le support d’Internet Explorer 6 sera maintenu jusqu’en 2014</a>.
</p>
<p>
  <span></span>
</p>
<p>
  Amy Barzdukas, la directrice de l’activité IE chez Microsoft, à même des arguments chocs :
</p>
<blockquote>
  <p>
    Il est difficile d’être cavalier avec cette économie en disant «&nbsp;oh il est temps de se mettre à jour&nbsp;»
  </p>
</blockquote>
<p>
  Mais elle est consciente quand même que :
</p>
<blockquote>
  <p>
    Si les gens qui sont frustrés par cette expérience commencent à dire «&nbsp;Microsoft craint et IE craint&nbsp;» en se basant sur une technologie vieille de bientôt 10 ans alors cela devient effectivement préoccupant
  </p>
</blockquote>
<p>
  Si l’on résume donc :&nbsp; Microsoft, pour ne pas froisser quelques D.S.I. à décidé de maintenir IE6, et donc, par la même légitimer un choix suicidaire de continuer à exploiter et même développer des intranets et applications Web pour Internet Explorer 6, quitte à s’exposer à une perte de crédibilité et une baisse d’image auprès «&nbsp;des gens&nbsp;».
</p>
<p>
  Je ne reviendrais pas sur <a href="http://blog.juliencrouzet.fr/2009/03/13/ie6-est-il-une-faute-professionnelle/">les raisons</a> qui font que IE6 doit immédiatement mourir de sa belle mort après presque 10 ans d’activité… Je constate juste qu’il est dommage de voir que Microsoft, qui semblait petit à petit adopter une stratégie plus réfléchie à propos des navigateurs (plus d’efforts pour adopter des standards, ballot screen, etc.) revient donc à ses origines.
</p>
</div>]]>
      </description>
      <pubDate>Sun, 16 Aug 2009 14:17:48 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582014</guid>
    </item>
    <item>
      <title>Adoptez une ligne de code !</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/yeYpbbhSd5s/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 206px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/07/miro-logo.png"><img title="miro-logo" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/07/miro-logo.png" height="79" alt="Adoptez une ligne de code de Miro !" width="196" /></a>
  <p>
    Adoptez une ligne de code de Miro !
  </p>
</div>
<p>
  Les projets Open Source et gratuits ont souvent du mal à se financer, et souvent en arrivent au même point : la cyber-quête !
</p>
<p>
  Le player Open Source <a href="http://www.getmiro.com/">Miro</a> n’échappe pas à la règle mais propose une méthode assez originale : il vous est proposé d’<a href="https://www.getmiro.com/adopt/">adopter une ligne de code</a> du player. Sympa non ?
</p>
<p>
  J’ai personnellement adopté <a href="http://getmiro.com/adopt/adoptee/388/4745d0/">January</a> <img src="http://blog.juliencrouzet.fr/wp-includes/images/smilies/icon_smile.gif" alt=":)" />
</p>
</div>]]>
      </description>
      <pubDate>Mon, 03 Aug 2009 13:53:23 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582015</guid>
    </item>
    <item>
      <title>Aptana Studio : Retour d'exp&#233;rience</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/H9RFDYgultU/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 114px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/aptana.png"><img title="aptana" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/08/aptana.png" height="104" alt="Retour d&quot;expérience sur Aptana Studio" width="104" /></a>
  <p>
    Aptana Studio
  </p>
</div>
<p>
  Un <a href="http://fr.wikipedia.org/wiki/Environnement_de_d%C3%A9veloppement_int%C3%A9gr%C3%A9">I.D.E.</a> pour un développeur, c’est l’une des choses primordiales. C’est une façon de travailler, des habitudes de développement et souvent, c’est presque une impératif. Bien sur, certains diront qu’un vrai développeur peut travailler avec n’importe lequel et c’est souvent vrai, mais avouons-le, nous avons tous nos petites habitudes !
</p>
<p>
  Depuis quelques années, je travaillais avec <a href="http://www.zend.com/fr/products/studio">Zend Studio</a>, que j’avais adopté plus par contrainte de mon employeur au début, mais depuis l’évolution de celui-ci vers <a href="http://fr.wikipedia.org/wiki/Eclipse_%28logiciel%29">Eclipse</a>, j’avais lâché le train en route n’ayant le temps de m’y mettre et je suis resté cloitré sur l’ancienne version (5.2), que certes je maitrisais jusqu’au bout des menus, mais commençait sérieusement à vieillir.
</p>
<p>
  J’ai donc décidé d’essayer <a href="http://www.aptana.com/">Aptana Studio</a>, dont on me parlait en bien depuis quelque temps et qui sur le papier, me séduisait fortement.
</p>
<p>
  Après 1 mois, voici mes retours d’expérience.
</p>
<p>
  <span></span>
</p>
<h2>
  Ce que j’ai aimé :
</h2>
<h3>
  Le support de jQuery
</h3>
<p>
  Aptana est livré avec le support prépackagé de plusieurs librairies / frameworks Javascripts, dont jQuery.
</p>
<p>
  A la clé, des templates de codes, de la complétion, de la coloration syntaxique adaptée, et caetera.
</p>
<h3>
  Le support de Smarty
</h3>
<p>
  Je suis depuis plusieurs années, un gran fan de <a href="http://www.smarty.net/">Smarty</a> (non pas les bonbons, quoique), que je continues à utiliser comme Vue dans mes développements <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur">MVC</a> sur Zend Framework.
</p>
<p>
  Et la, encore une exclusivité, Aptana Studio nous offre un complétion de code, un coloration syntaxique et tout le toutim pour les fichiers de gabarits smarty, y compris sur vos propres fonctions !
</p>
<h3>
  En bref, les complétions multilangage
</h3>
<p>
  En plus des deux éléments cités, Aptana Studio offre une complétion très bien faite sur tout ce qui est possible : HTML, PHP, XML, JSON, CSS, etc. Et ca marche plutôt bien !
</p>
<h2>
  Ce que je n’ai pas aimé :
</h2>
<h3>
  Des bugs en pagaille dans le formatage
</h3>
<p>
  Au fur et à mesure que je configurais des fonctionnalités, j’ai eu de plus en plus de fil à retordre avec des bugs, plus ou moins génants.
</p>
<p>
  Le plus embêtants se trouvent au niveau du formatage de code. Aptana Studio, comme la plupart des I.D.E. basés sur Eclipse vous propose de formater votre code selon les règles que vous avez configurées, comme les retour à la ligne, les indentations, les espaces après les virgules, etc.
</p>
<p>
  Force est de constater que par exemple, les retours à la ligne dans la déclarations de tableaux (array()) ou ceux des déclarations CSS qui commencent par un identifiant (#monDiv .maClasse) ont des comportements complètement aléatoire !
</p>
<h3>
  Des bugs aussi dans la gestion «&nbsp;remote&nbsp;»
</h3>
<p>
  Eclipse (ce n’est qu’un point de vue…) n’est pas pratique pour développer ‘en remote’ ; c’est à dire que vous modifiez et testez sur un serveur distant via FTP ou SFTP par exemple.
</p>
<p>
  Un bout de scotch est malgré tout là pour parer à cette problématique dans Aptana c’est un petit script bien nommé «&nbsp;Upload file on save&nbsp;» qui est censé envoyer vos fichiers via FTP / SFTP lorsque vous les sauvegarder.
</p>
<p>
  Première mauvaise impression : il faut modifier le script pour l’activer !
</p>
<p>
  Deuxième : il ne marche pas une fois sur trois, et tout est désynchronisé.
</p>
<h3>
  Des fonctionnalités mal finies
</h3>
<p>
  J’ai été impressionné lorsque j’ai vu un onglet «&nbsp;iPhone view&nbsp;». Pensez donc ! Un émulateur iPhone intégré à un I.D.E !
</p>
<p>
  En fait, il ne s’agit que d’une preview HTML de votre navigateur classique rétrécie au dimensions du mobile et entourée d’une photo d’iPhone … arf !
</p>
<h3>
  Une complétion PHP de votre projet mal pensée
</h3>
<p>
  Si vous souhaitez avoir une complétion sur vos propre classes (évidemment !) en PHP. Beaucoup de manipulations nécessaires : il va falloir définir la nature primaire de votre projet en PHP et ajoutez les répertoires ou sont vos classes dans une liste. Et ce pour chaque projet.
</p>
<p>
  Bien sur, il va falloir après à la main les supprimer, sinon vous atteindrez les 45 secondes à l’ouverture de chaque projet des les 5 projets (~ 1 Mo de code) atteint …
</p>
<h2>
  Conclusion
</h2>
<p>
  Malgré une première impression, Aptana Studio semble très utile, très prometteur, mais pas assez stable et mature pour que je l’adopte. Dommage.
</p>
<p>
  Je vais maintenant me pencher sérieusement sur <a href="http://www.zend.com/fr/products/studio/">Zend Studio 7</a> (qui gère PHP5.3 !)… Retours dans quelques semaine, sauf incident majeur <img src="http://blog.juliencrouzet.fr/wp-includes/images/smilies/icon_wink.gif" alt=";)" />
</p>
</div>]]>
      </description>
      <pubDate>Mon, 03 Aug 2009 11:54:47 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582016</guid>
    </item>
    <item>
      <title>Back dans les bacs !</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/-yu4HZ6jk4Q/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 180px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/05/toile-araignee-perles-rosee_5600.jpg"><img title="toile-araignee-perles-rosee_5600" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/05/toile-araignee-perles-rosee_5600-300x225.jpg" height="127" alt="T&amp;apos;étais ouuuuuu ?" width="170" /></a>
  <p>
    T'étais ouuuuuu ?
  </p>
</div>
<p>
  Une fois de plus, je vous ai abandonné pendant presque un mois.
</p>
<p>
  Désolé, j’étais invité par David et Cathy Guetta pour la soirée F**k Me I’m Famous de Meudon. On a pris des acides et bu du cidre, du coup on a pas vu le temps passer.
</p>
<p>
  Bref, beaucoup de travail, tout ça, tout ça.
</p>
<p>
  <a href="http://feedads.g.doubleclick.net/~a/RWvc9BGbra6yhYYDW3bkWC_xV4k/0/da"><img src="http://feedads.g.doubleclick.net/~a/RWvc9BGbra6yhYYDW3bkWC_xV4k/0/di" /></a><br />
  <a href="http://feedads.g.doubleclick.net/~a/RWvc9BGbra6yhYYDW3bkWC_xV4k/1/da"><img src="http://feedads.g.doubleclick.net/~a/RWvc9BGbra6yhYYDW3bkWC_xV4k/1/di" /></a>
</p>
</div>]]>
      </description>
      <pubDate>Mon, 03 Aug 2009 09:48:36 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582017</guid>
    </item>
    <item>
      <title>PHP5.3 : Quelles nouveaut&#233;s ?</title>
      <link>http://feedproxy.google.com/%7Er/thetechguyfr/%7E3/TX7HrKEVFFE/</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><div style="width: 209px;">
  <a href="http://blog.juliencrouzet.fr/wp-content/uploads/2009/07/800px-PHP-n_logo.svg1_2.png"><img title="PHP5.3 est sorti le 30 Juin" src="http://blog.juliencrouzet.fr/wp-content/uploads/2009/07/800px-PHP-n_logo.svg1_2-300x157.png" height="104" alt="PHP5.3 est sorti le 30 Juin" width="199" /></a>
  <p>
    Les nouveautés de PHP5.3
  </p>
</div>
<p style="text-align: left;">
  Le 30 Juin dernier est sorti PHP5.3, discrètement… Pourtant c’est une évolution majeure, qui ne comprends pas que des corrections de bugs (140 corrections quand même).
</p>
<p style="text-align: left;">
  Quoi de neuf alors dans cette version ?
</p>
<p style="text-align: left;">
  <span></span>
</p>
<h2 style="text-align: left;">
  Les namespaces
</h2>
<p>
  Annoncé comme l’une des évolutions majeures du légendaire PHP6 (sortie en 2087, peut être), les namespaces ou espaces de nommages sont l’une des dernières étapes de la route vers un vrai langage objet.
</p>
<p>
  Alors qu’est ce que c’est «&nbsp;simplement&nbsp;» ? C’est un moyen de faire cohabiter ensemble plusieurs librairies de manière simple et d’organiser simplement son code.
</p>
<p>
  Le but premier est de pouvoir nommer <strong>simplement</strong> des classes, constantes et fonctions sans risquer le conflit avec du code existant. Jusqu’ici, on utilisait des techniques, comme par exemple nommer ses classes en respectant des règles comme&nbsp; <em>NomDuFramework_NomDeLaLibrairie_NomDeLaClasse</em>. Avec les namespaces, il est simple de compartimenter son code et ne pas se soucier des conflits.
</p>
<p>
  Un exemple, qui j’espère, sera parlant :
</p>
<pre name="code">

/**
 * On execute du code dans le deuxièmme espace
 */
namespace        Espace2 {
  echo "On est dans le deuxièmme espace :\n";
  var_dump(CONSTANTE);
  fonction();
  $objet = new Classe();
  $objet-&gt;test();
  echo "\n\n";
}
/**
 * On execute du code dans l'espace global
 */
namespace {
  echo "On est dans l'espace global :\n";
  echo "Est-ce que la constante CONSTANTE est définie ?\n";
  var_dump(defined('CONSTANTE'));
  echo "Est-ce que la fonction fonction() est définie ?\n";
  var_dump(function_exists('fonction'));
  echo "Est-ce que la classe 'Classe' est définie ?\n";
  var_dump(class_exists('Classe'));
}
?&gt;
</pre>
<p>
  Avec cette évolution, on fait un pas de plus vers les lettres de noblesse de PHP dans le monde des langages objets, à plus d’un point.
</p>
<p>
  Aujourd’hui, beaucoup de gens pensent leur code comme une accumulation de fonctions (souvent un copier-coller de <a href="http://phpfonctions.fr/">sites</a>). Utiliser des namespaces pousse le développeur à s’imposer une certaine rigueur et à bien séparer son code de manière logique.
</p>
<p>
  J’attends avec impatience la 2.0 de <a href="http://framework.zend.com">Zend Framework</a> qui utilisera les namespaces <img src="http://blog.juliencrouzet.fr/wp-includes/images/smilies/icon_smile.gif" alt=":)" />
</p>
<h2>
  Les fonctions anonymes
</h2>
<p>
  Les fonctions anonymes (ou <em>closures</em>) sont des blocs de codes exécutables (donc des fonctions) mais qui ne possèdent pas de noms pour être rappelées plus tard. La première fois cela peut paraitre déroutant et on peut ne pas comprendre l’utilité, mais par exemple, si vous utilisez jQuery, vous saisissez immédiatement l’opportunité !
</p>
<p>
  Prenons par exemple la fonction PHP <a href="http://fr2.php.net/manual/fr/function.array-walk.php">array_walk()</a> qui permet d’appliquer une fonction sur chaque élément d’un tableau. Avant on définissait une fonction, on la nommait et on passait le nom de la fonction en argument, comme ceci :
</p>
<pre name="code">
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a &lt; $b) ? -1 : 1;
}
uasort($array, 'cmp');
</pre>
<p>
  Maintenant, on peut directement passer une fonction anonyme comme argument sans avoir à créer de fonction au préalable :
</p>
<pre name="code">
uasort($array, function($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a &lt; $b) ? -1 : 1;
});
</pre>
<h2>
  "late static binding"
</h2>
<p>
  Le late static binding ou la "Résolution statique à la volée" est un concept assez théorique au premier abord mais qui solutionne une importante limitations de PHP.
</p>
<p>
  Dans le cadre de méthodes statiques d'une classe, le mot clé <em>self</em> ou la constante <em>__CLASS__</em> qui font référence à la classe "courante" sont assignées par PHP lors de l'analyse du code et non au moment de l'exécution, donc en cas d'héritage, elles font référence à la classe parente et non à la classe courante.
</p>
<p>
  Cela peut paraitre compliqué, alors prenons un exemple, le code suivant :
</p>
<p>
  affichera "Je suis la classe Papa".
</p>
<p>
  PHP5.3 étend donc le mot-clé <em>static</em>, pour l'utiliser comme une référence à la classe courante <strong>pendant l'exécution</strong> et non pendant la compilation. On peut donc écrire le code suivant :
</p>
<pre name="code">
class    Papa {
  public static function  jeSuis() {
    return (__CLASS__);
  }

  public static function  annonceToi() {
    echo 'Je suis la classe ' . static::jeSuis() . "\n";
  }
}
class    Filston extends Papa {
  public static function  jeSuis() {
    return (__CLASS__);
  }
}

Filston::annonceToi();
</pre>
<p>
  qui affichera bien "Je suis la classe Filston".
</p>
<h2>
  Le contrôle du garbage collector
</h2>
<p>
  Pour ceux qui ne serait pas à l'aise, consultez l'article <a href="http://fr.wikipedia.org/wiki/Ramasse-miettes_%28informatique%29">Garbage Collector</a> sur Wikipedia.
</p>
<p>
  N'ayant eu le temps de tester encore en détail, je vous conseille la lecture de ce <a href="http://blog.pascal-martin.fr/post/php-5.3-garbage-collector-vs-consommation-memoire">très bon billet</a>.
</p>
<h2>
  L'opérateur ternaire simplifié
</h2>
<pre name="code">
$valeur = ($valeur) ?: $default;
</pre>
<p>
  à la place de
</p>
<pre name="code">
$valeur = ($valeur) ? $valeur : $default;
</pre>
<h2>
  Et puis aussi ...
</h2>
<p>
  D'autres <a href="http://fr3.php.net/manual/en/migration53.php">petits changements</a> que je vous laisse consulter... <img src="http://blog.juliencrouzet.fr/wp-includes/images/smilies/icon_smile.gif" alt=":)" />
</p>
<p>
  Bonne lecture et bon tests !
</p>
<p>
  <a href="http://feedads.g.doubleclick.net/~a/wpa8mz19XDEbsfDqh93gox9n1q4/0/da"><img src="http://feedads.g.doubleclick.net/~a/wpa8mz19XDEbsfDqh93gox9n1q4/0/di" /></a><br />
  <a href="http://feedads.g.doubleclick.net/~a/wpa8mz19XDEbsfDqh93gox9n1q4/1/da"><img src="http://feedads.g.doubleclick.net/~a/wpa8mz19XDEbsfDqh93gox9n1q4/1/di" /></a>
</p>
</div>]]>
      </description>
      <pubDate>Sun, 05 Jul 2009 01:51:13 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2009:/article/12582018</guid>
    </item>
  </channel>
</rss>
