mageekblog - Mot-clé - E_ALLLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearNaissance de PHP 5.4 - environs 90 joursurn:md5:ac34af821900dae34ba7ec321ad48ab92011-08-03T22:30:00+02:002011-08-05T06:42:47+02:00mageekguyPHP Xalpha 3E_ALLmagic quotesnotation binairePHP 5.4Pierrick Charronshort array syntax<p>Tout à l'heure, la version <a href="http://svn.php.net/viewvc?view=revision&revision=314202">alpha 3</a> de <a href="https://wiki.php.net/todo/php54">PHP 5.4</a> a été créé dans le <a href="http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/">dépôt subversion</a> correspondant et l'annonce officielle de sa disponibilité devrait être faite dès demain, conformément au calendrier prévu.</p>
<p>Du coup, je me risque à entamer une nouvelle série de billet faisant le compte à rebours d'ici à la sortie de cette version très attendue, vu le pic de visites que j'observe dans mes statistiques de fréquentation de ce blog dès que je publie un billet la concernant.</p>
<p>Et je pense que ce n'est pas cette version alpha 3 qui va me faire mentir, vu les fonctionnalités qui lui ont été ajoutées depuis la version alpha 2.</p> <p>La nouveauté principale de cette version est sans conteste le support de la syntaxe courte pour la définition des tableaux, suite <a href="https://wiki.php.net/todo/php54/vote">au vote</a> d'il y a maintenant <a href="http://blog.mageekbox.net/?post/2011/07/17/R%C3%A9sultats-du-vote-%21">quelques semaines</a>.</p>
<p><a href="http://www.php.net">PHP</a> permettra donc dorénavant de créer des tableaux à l'aide de l'une ou l'autre de ces deux notations :</p>
<blockquote><pre><code><?php
$a = [1, 2, 3];
$b = ['orange' => 'orange', 'pomme' => 'apple', 'citron' => 'lemon'];
?></code></pre></blockquote>
<p>Toujours conformément au vote des contributeurs et de la communauté, cette version alpha 3 permet la définition de nombres entiers en notation binaire.</p>
<p>En plus de la notation octale et héxadécimale, les développeurs pourront donc initialiser avec la notation binaire :</p>
<blockquote><pre><code><?php
$year2010 = 0x7da; // hexadécimale
$year2010 = 03732; // octal
$year2010 = 0b11111011010; // binaire
?></code></pre></blockquote>
<p>La dernière nouveauté significative est une chose que j'attendais depuis très longtemps.</p>
<p><span class="Apple-style-span">En effet, si </span><a href="http://www.php.net">PHP</a><span class="Apple-style-span"> est un langage relativement dynamique, puisqu'il est possible de créer un objet à partir d'une variable, via la syntaxe <code>new $class()</code>, et d'appeler une fonction ou une méthode, voir une propriété d'une manière similaire, via <code>${expression}()</code> ou <code>$object->{expression}()</code>, jusqu'à maintenant, il n'était pas possible de la faire avec une méthode statique.</span></p>
<p>Cependant, grâce au travail de <a href="http://adoy.net/">Pierrick Charon</a>, PHP 5.4 alpha 3 permet d'appeler une méthode statique via une variable, grâce à la syntaxe <code>uneClasse::{expression}()</code>.</p>
<p>Le mode <abbr title="FastCGI Process Manager"><a href="http://www.php.net/manual/fr/install.fpm.php">FPM</a></abbr> de <a href="http://www.php.net">PHP</a> a également été un peu amélioré, via l'ajout de la directive de configuration <code>process.max</code> qui permet de définir le nombre maximum de processus qui peuvent être lancés simultanément.</p>
<p>Pour ce mode, il est également maintenant possible de définir plusieurs fois une même directive de configuration, la valeur finalement retenue étant la dernière définie. </p>
<p>De plus, il n'y a pas eu que des ajouts de fonctionnalités puisqu'il y a également eu des suppressions, et non des moindres.</p>
<p>Décriées depuis des années et reconnues comme étant l'un des plus gros boulets historiques du langage, les <q>magic quotes</q> appartiennent en effet dorénavant au passé, puisqu'elles ne sont <a href="http://blog.mageekbox.net/?post/2011/07/23/La-r%C3%A9volution-continue-%21">plus supportées par PHP 5.4</a>.</p>
<p>Pour finir, le comportement du langage a également été modifié, puisque le niveau d'erreur <code>E_ALL</code> contient maintenant par défaut le niveau <code>E_STRICT</code>.</p>
<p>Les développeurs n'auront donc plus à l'avenir besoin d'activer spécifiquement le niveau d'erreur <code>E_STRICT</code> dans leur fichier <code>php.ini</code>, puisque pour en bénéficier il leur suffira d'utiliser <code>E_ALL</code>. </p>
<p>Ce n'est pas la seule modification dans le comportement du langage, car j'ai découvert une régression qui n'est malheureusement pas actuellement documentée, même si j'ai fais <a href="https://bugs.php.net/bug.php?id=55300">le rapport de bug correspondant</a>.</p>
<p>PHP 5.4 oblige en effet depuis sa version alpha 1 que le constructeur de la classe parente soit appelé dans une classe dérivée d'une des classes de la SPL permettant la manipulation du système de fichier, comme par exemple <code>\DirectoryIterator</code>, afin de ne pas permettre au développeur de créer des objets dans un état inconsistant.</p>
<p>Si cette nouvelle obligation n'est pas respectée, le langage génèrera une exception, ce qui peut s'avérer un réel problème si du code en production a été écrit de la manière inadéquate. </p>
<p>Cette version alpha 3 est donc significative et n'est pas juste une version corrective, même si elle contient également son lot de corrections de bugs, notamment au niveau de la <abbr title="Standard PHP Library"><a href="http://www.php.net/manual/fr/book.spl.php">SPL</a></abbr>.</p>
<p>Je vous invite donc à la télécharger dès qu'elle sera disponible afin qu'elle soit testée le plus complètement possible, même si en l'état elle n'est clairement pas adapté à un environnement de production.</p>
<p>Elle vous permettra de patienter jusqu'à la version béta 1, qui devrait être disponible à compter du 25 août 2011, si le calendrier prévu est respecté, ce dont je doute assez peu vu la très forte motivation des contributeurs actuellement.</p>
<p>Et pour la même raison, je pense qu'à cette même date, <a href="https://wiki.php.net/todo/php54">la liste des choses restant à faire</a> avant la sortie de la version finale de PHP 5.4 devrait être vidée.</p>
<p>[EDIT] Au jour dit, <a href="http://blog.experimentalworks.net/">David Soria Parra</a> et <a href="http://php100.wordpress.com/">Stanislav Malyshev</a> ont <a href="http://news.php.net/php.internals/54393">rendu disponible</a> la version alpha 3 de PHP 5.4.</p>http://blog.mageekbox.net/?post/2011/08/03/Naissance-de-PHP-5.4-environs-90-jours#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/279PHP est vicieuxurn:md5:6afbb9827f2f6ef0b6fd61f8d8ac3eca2010-02-19T11:13:00+01:002010-02-19T15:04:36+01:00mageekguyPHPE_ALLE_STRICTPHPrequire<p>Il y a quelques temps, j'ai eu un comportement très étrange avec un bout de code <a href="http://www.php.net">PHP</a> <q>traditionnel</q>.</p>
<p>En effet, une même fonctionnalité implémentée de deux manières différentes ne donnait pas le même résultat.</p>
<p>Dans un cas, <a href="http://www.php.net">PHP</a> me générait une erreur, et dans l'autre, tout se passait sans problème.</p> <p>La version qui ne posait aucun problème était la suivante :</p>
<blockquote><pre><code><?php<br /><br />error_reporting(E_STRICT);<br /><br />class a { public function test($foo) {} }<br />class b extends a { public function test($foo, $bar) {} }<br /><br />$b = new b();<br /><br />?></code></pre></blockquote>
<p>La version, qui était strictement identique fonctionnellement parlant, mais qui posait problème était quand à elle composée de trois fichiers.</p>
<p>Le premier fichier, nommons le <code>a.php</code>, contenait le code suivant :</p>
<blockquote><pre><code><?php<br /><br />class a { public function test($foo) {} }<br /><br />?></code></pre></blockquote>
<p>Le second fichier, nommons le <code>b.php</code>, contenait le code suivant :</p>
<blockquote><pre><code><?php<br /><br />class b extends a { public function test($foo, $bar) {} }<br /><br />?><br /></code></pre></blockquote>
<p>Et le troisième et dernier fichier, <code>all.php</code>, contenait le code suivant :</p>
<blockquote><pre><code><?php<br />error_reporting(E_STRICT);<br /><br />require('a.php');<br />require('b.php');<br /><br />$b = new b();<br />?><br /></code></pre></blockquote>
<p>A l'éxécution de <code>all.php</code>, <a href="http://www.php.net">PHP</a> générait l'erreur suivante :</p>
<blockquote><pre><code>PHP Strict standards: Declaration of b::test() should be compatible with that of a::test() in /path/to/b.php on line 3</code></pre></blockquote>
<p>En résumé, inclure deux classes à l'aide de <code>require()</code> ne revenait pas au même que de déclarer les deux classes dans le même fichier...</p>
<p>Afin d'être sur de mon fait, j'ai demandé à mes collégues et aux personnes présentes sur <code><a href="http://www.jelix.org">#jelix</a></code> sur <code>irc</code> de confirmer qu'ils avait bien le même comportement, et à ma grande surprise, ce fût le cas.</p>
<p>Vous ne me croyez pas ? cela vous semble trop gros pour être vrai ? essayez...</p>
<p>Il y a 85% de chances, et voir même 100% de chances si vous n'avez jamais touché à la directive <code>error_reporting</code> de votre <code>php.ini</code>, que vous obteniez le même comportement.</p>
<p>En effet, <code>error_reporting</code> a pour valeur par défaut <code>E_ALL</code>.</p>
<p>Cela signifie que lorsque <a href="http://www.php.net">PHP</a> interpréte le code de la première version, la directive <code>error_reporting</code> n'a pas la valeur <code>E_STRICT</code>, mais bien <code>E_ALL</code>, puisque l'appel à <code>error_reporting(E_STRICT)</code> n'a pas encore été éxécuté.</p>
<p>En effet, c'est lors de l'éxécution du script proprement dit, et donc après son interprétation, que l'appel à <code>error_reporting(E_STRICT)</code> est effectué et que <code>error_reporting</code> prend réellement la valeur <code>E_STRICT</code>.</p>
<p>Or, avec la seconde version qui fait appel à <code>require()</code>, les fichiers <code>a.php</code> et <code>b.php</code> sont inclus <strong>après</strong> l'interprétation du code et lors de son éxécution. Au moment des appels à <code>require()</code>, <code>error_reporting</code> a donc la valeur <code>E_STRICT</code>.</p>
<p>Voici donc la raison pour laquelle deux codes fonctionnellement identiques n'ont pas le même comportement : l'environnement d'éxécution n'est tout simplement pas configuré de la même manière dans les deux cas.</p>
<p>La solution du problème est donc très simple : Il suffit de donner la valeur E_ALL|E_STRICT à la directive <code>error_reporting</code> dans votre <code>php.ini</code>.</p>
<p>Vicieux, non ?</p>http://blog.mageekbox.net/?post/2010/02/19/PHP-est-vicieux#comment-formhttp://blog.mageekbox.net/?feed/atom/comments/88