PHP 5.3 alpha
Posté le samedi 8 novembre 2008 à 2 h 08, Read it in english with Googleça fait longtemps qu’on l’attend, il est encore repoussé mais ont devrait le voir arriver avant 2009. faite hommage à PHP 5.3.
Alors qu’est-ce qu’il y a de si nouveau pour que je m’esclaffe ainsi. Globalement on note 3 améliorations notables en dehors des nouvelles fonctions qui nous seront bien utile mais qu’on pouvait déjà faire en grugeant un peu :
- les Namespaces
- Late Static Bindings et __callStatic
- les fonctions lambda et les restrictions de contexte
- driver intégré MySQLnd
Je ne donnerais pas de détail sur driver intégré optionnel MySQLnd car j’y vois plus d’inconvénients que d’avantages. C’est très appréciable de voir intégrer un driver au moteur de php et on peut imaginer à termes des optimisations de mémoire et de cache non négligeable. Mais qu’en est-il de la maintenance ? Le driver (à ma conaissance) devra être intégré à la compilation de php donc une recompilation sera nécessaire à chaque nouvelle version de php. Ce sera utilise pour les applications critiques qui nécessitent des tests avant mise en production. Le mod_php d’apache est très difficilement exécutable avec 2 versions différentes de php. Ces applications tournent donc sur en mode fastCGI (CGI est au oubliette) qui permet de lancer facilement 15 versions de php sur le même serveur. Cependant mod_php reste nettement plus rapide que fastCGI, je l’utilise et je ne souhaite pas recompiler php à chaque changement de version, n’ayant pas d’environnement de test.
Les Namespaces
C’est une implémentation simple des namespaces qui va nous permettre de classer un peut toutes nos librairies afin d’une part d’éviter les conflits et de d’autre part d’y voir plus clair (en évitant d’utiliser de faux namespaces avec des undescore un peu partout…).
Pour l’utilisation je vous conseil de lire le manuel. Un petit exemple, (avec php 5.3 alpha2, mais il reste des bugs) :
ns.php :
Xorax.php :
}
Xorax.Info.php :
'Xorax::Info::test()''http://xorax.info');
// actualy if you don't want declare using Xorax namespace :
// ::Xorax::linkhref('http://xorax.info');
}
Les namespaces sont résolu à la compilation. Lorsqu’un nom de classe n’est pas précédé d’un espace de nom, php va rechercher dans l’espace de nom du contexte courant, puis dans le namespace global, puis enfin l’envoyer à un __autoload pour être charger automatiquement.
Late Static Bindings et __callStatic
ça fait longtemps que j’attends ceci et je dois dire que j’ai bien du mal à programmer en objet sans ça. La fin des fixations static (late static binding) vont nous servir à implémenter correctement l’héritage sur nos variables static.
Actuellement lorsque vous appelez une variable static dans votre classe, vous ne pouvez pas monter d’un niveau. Votre variable self::$myStaticVar fera référence à une variable static de la classe courante ou de ses parents mais ne fera jamais référence à une variable static défini dans une classe enfant. C’est donc très difficile d’implémenter un héritage avec les variable static. Mais maintenant (enfin bientôt) plus besoin de se prendre le chou. Vous pourrez faire static::$myStaticVar et votre variable pourra faire référence à une variable d’une classe enfant.
Un exemple vaut mieux que des long discours :
sortie :
A::testA from A :
static::$s = A::$s
self::$s = A::$s
A::testA from B :
static::$s = B::$s // voilà notre héritage descendant !!!
self::$s = A::$s
B::testB from B :
static::$s = B::$s
self::$s = B::$s
C’était difficile de se sentir à l’aise avec la POO sans ça !
Pour ce qui est dans la fonction __callStatic(), vous l’aurez compris c’est la même chose que la fonction __call, mais avec les fonctions static. Pratique efficace inévitable.
les fonctions lambda et les restrictions de contexte
Voilà une nouvelle structure de fonction que je ne pensais pas voir arriver en php. Mais le langage essayant malgré lui de se tourner vers une perspective objet, ceci devait arrivé. Voici donc les lambda functions, ou fonctions anonymes. Comme le nom l’indique, cela va vous permettre de créer des fonctions sans nom à la volé que vous stockerez dans des variables ou que vous exécuterez directement. Évidemment il va manquez la notion de contexte présent dans les autres (vrai) langages objet mais pour l’instant ça ouvre un horizon assez large de possibilités. Certes, cela était déjà possible auparavant à l’aide de la méthode create_function(), mais très couteux car php devait reparser le contenu des parametres passés à create_function(). Maintenant c’est lors de la compilation que la fonction anonyme sera identifié comme tel.
Pour ce qui est de la notion de contexte, une fonction anonyme déclaré dans une méthode de classe pourra se référer au contexte de la classe où elle a été déclaré et pourra donc utiliser $this, parent, self et le nouveau static. Si cette fonction anonyme n’a pas la nécessité de se référer au contexte courant, on pourra la déclarer comme fonction anonyme static. En revanche, impossible de changer le contexte de la fonction une fois déclaré.
Comme pour le reste rien ne vaut un bon exemple :
//$a->func(); // fatal error : undefined function
"\n""\n"'B->a''B::$a'
sortie :
$test()
A - $test()
A->$func() [ a:A->a, sa : A::$a]
A - A->$func() [ a:A->a, sa : A::$a]
B - A->$func() [ a:A->a, sa : A::$a]
Sans être complet donc, ceci va tout de même nous éviter de pourrir notre espace de noms avec des fonctions spécifiques.
Si vous souhaitez utiliser des variables du contexte de déclaration dans votre fonction vous pouvez utiliser la syntaxe avec use :
sortie :
test-a = 2
$a = 1
test2-a = 2
$a = 2
On espère voir arriver cette nouvelle version pour noël. C’est une évolution majeur de la structure du language php qui va nous simplifier la vie sur bien des points. Et pas forcément au détriment des performances puisque la plupart de ces améliorations sont de la structure donc au niveau du compilateur. L’implémentation de système de cache comme APC se fera donc de plus en plus ressentir. A vos clavier !!!
Le séparateur de namespace ne serait plus :: pas bel et bien le backslash \ a partir de l’alpha3. Je trouve ça carrément horrible.. :s
http://wiki.php.net/rfc/namespaceseparator
ah quelle défaite…
on va encore se torde les doigts :s
mais bon faut dire que c’était en conflit avec les éléments statics.
On va devoir se sacrifier pour les qwerty…