PHP 5.3.3 est sorti !

La dernière version stable de PHP est disponible depuis hier. Quatre mois après la sortie de PHP 5.3.2, la version 5.3.3 corrigent près d’une centaine de bugs, dont certains posaient des problèmes de sécurité.

Au-delà des corrections de bugs, cette nouvelle release entraîne un incompatibilité concernant la déclaration des constructeurs des classes appartenant à un espace de nom. Les « namespaces » ou espaces de nom n’ayant été introduit dans PHP que dernièrement dans le version 5.3, l’incompatibilité ne pose donc problème que pour les versions 5.3.x.

Depuis l’apparition de la POO dans PHP, les concepts ont bien évolués, l’écriture et l’interprétation du code également. Ainsi en PHP 4, il fallait écrire le code suivant pour utiliser un constructeur.

class Bar {
    function Bar() {}
}

Le constructeur était une méthode dont le nom était à l’identique celui de la classe. La version 5 de PHP a introduit le mot clé __construct pour le constructeur comme le montre le code ci-dessous. Pour des raisons de compatibilités, la façon de faire de la version PHP 4 est toujours reconnue, encore aujourd’hui.

class Bar {
    public function __construct() {}
}

PHP 5.3.3 entame à mon sens un premier virage afin de supprimer cette compatibilité. En effet les classes appartenant à un espace de noms n’auront désormais plus accès à cette possibilité. Cela va donc obliger les développeurs à utiliser les bonnes pratiques comme le montre l’exemple ci-dessous.

namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method in PHP 5.3.3
    }
}

La question est donc : à quand l’impossibilité d’utiliser la méthode Bar comme un constructeur ?

Partager et découvrir : Ces icônes sont des liens vers des sites de partage de signet sociaux où les lecteurs peuvent partager et découvrir de nouveaux liens.
  • Wikio FR
  • Facebook
  • MySpace
  • TwitThis
  1. Qu’est-ce que les « espaces de nom » ?!

  2. C’est bête j’aimais bien le constructeur du même nom que la classe, ça faisait comme du Java :)

    Le namespace c’est comme le package en Java si je ne me trompe pas. Tu indiques que ta classe fait partie du sous-ensemble « fr.ekho.monapplication.moduleZ » et tu aura probablement la possibilité de limiter la visibilité de certaines méthodes au namespace auquel la classe appartient. Une classe dans un autre namespace ne pourra pas accéder à certaines méthodes d’une classe de ce namespace.

    Correct Jéré ?

  3. Moi, ce qui m’interesse, c’est les arguments en faveur du __construct par rapport au constructeur nommé comme la classe.

    La différence par rapport à Java, c’est qu’en java, les constructeurs ont pas de type de retour, on peut pas confondre avec une methode, ce qui n’est pas forcement le cas en javascript. Est-ce pour ça ?

  4. C’est parce que php est mal fichu ;)
    Ils expliquent ici (http://stackoverflow.com/questions/217618/construct-vs-sameasclassname-for-constructor-in-php) qu’il n’existait pas de mot clé « super » comme en Java pour appeler le constructeur parent en cas d’héritage. Tu étais obligé de spécifier « parent::ClasseParent() », ce qui impose un refactoring plus lourd pour changer le nom de la classe mère. Avec « parent::__construct », le problème est réglé.

  5. Ok,intéressant à savoir, merci pour l’info !

  6. Et le pire, c’est que j’ai à peu près compris…

  7. @Fufu

    Pour le moment, il n’existe pas de restrictions entre les packages comme en java. On peut appeler tout ce qui est public d’un namespace à un autre. Les espaces de noms n’ont pas été créés dans cette optique. Ils ont été développés dans l’optique de régler deux problèmes

    - les collisions entre les noms de classes, functions… créés par les développeurs et ceux internes à PHP, ou autre framework

    - la possibilité de faire des alias et/ou de réduire la taille des noms de classes

    Aujourd’hui, si vous utilisez un connecteur à une base de données, on est obliger d’avoir une classe qui va instancier un handler
    - eZDbHandlerMysql.php
    - eZDbHandlerMysqli.php

    Cela allonge les noms des classes inutilement. Les namespaces vont donc nous soulager. On pourra avoir un fichier
    - db/mysql/handler.php
    - db/mysqli/handler.php avec le même nom de classe

    @Lyr

    En php, toutes fonctions ou méthodes retournent true si rien n’est précisé.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>