Fonctionnalites dans PHP 5.4 (alpha release)

Voici quelques fonctionnalités que la version 5.4 Alpha1 de PHP offre.

Ajouts

Array Deferencing

La fonctionnalité “Array Deferencing” désigne le chainage des accès aux indices d’un tableau PHP. Un peu de la même façon qu’il est possible de faire un

    class Foo {
        public function bar() { }
    }

    function func() {
        return new Foo();
    }

    func()->bar();

Cette fonctionnalité a été rejetée dans le passe a cause d’incertitudes concernant les “memory leaks”. Maintenant, après un patch récemment ajouté, il est possible de faire

function foo() {
return array(1, 2, 3);
}
echo foo()[2]; // affiche 3

L’utilité d’une telle fonctionnalité est plus visible avec les closures :

$func = function() { return array('a', 'b', 'c'); };
echo $func()[0]; // affiche a

Les Traits

C’est une manière de réutiliser le code. Puisque PHP est un langage a héritage Simple, un trait est une manière de réduire certaines limites de l’héritage simple en autorisant le développeur à réutiliser un certain nombre de méthodes dans des classes indépendantes.
Un trait est semblable à une classe, mais il ne sert qu’à grouper des fonctionnalités d’une manière intéressante. C’est un ajout à l’héritage traditionnel qui autorise la composition horizontale de comportements, c’est à dire l’utilisation de méthodes de classe sans besoin d’héritage.
Imaginons ce cas :

 class ezcReflectionMethod extends ReflectionMethod {
   /* ... */
   function getReturnType() { /*1*/ }
   function getReturnDescription() { /*2*/ }
   /* ... */
 }

 class ezcReflectionFunction extends ReflectionFunction {
   /* ... */
   function getReturnType() { /*1*/ }
   function getReturnDescription() { /*2*/ }
   /* ... */
 }

Vous remarquez que les deux méthodes getReturnType et getReturnDescription sont réécrites du fait qu’il n’y a pas de support d’héritage Multiple. Avec les traits, on peut faire comme suit :

 trait ezcReflectionReturnInfo {
   function getReturnType() { /*1*/ }
   function getReturnDescription() { /*2*/ }
 }

 class ezcReflectionMethod extends ReflectionMethod {
   use ezcReflectionReturnInfo;
   /* ... */
 }

 class ezcReflectionFunction extends ReflectionFunction {
   use ezcReflectionReturnInfo;
   /* ... */
 }

Pour plus d’informations sur les traits : http://www.php.net/manual/fr/language.oop5.traits.php

Support de $this dans les Closures

Dans les versions de PHP inférieures a 5.4, il n’était pas possible de se référer au scope d’une classe depuis une closure. Ceci est rendu possible, le mot clé $this peut être maintenant utilise a l’intérieur d’une closure pour référer les propriétés d’une classe. Exemple:

class A {
  private $value = 1;
  function single_getter($name) {
    return function() use ($name) {
      return $this->$name;
    };
  }
}
class B {
  private $value = 2;
  function test() {
    $a = new A;
    $single_getter = $a->single_getter('value');
    print $single_getter();
  }
} 

$b = new B;
$b->test();
//affiche 1

http://drupal4hu.com présente un tutoriel plus en détail sur cette fonctionnalité.

Appel de methode indirect depuis un array

Cette fonctionnalité permet d’utiliser un array pour effectuer un callback. Le tableau doit être  composé de deux éléments, le premier comme nom d’une classe, le deuxième comme nom de méthode. Exemple :

class Hello {
   public function world($x) {
      echo "Hello, $x\n"; return $this;
   }
}

$f = array('Hello','world');
var_dump($f('you')); // Hello, you

Ajout de http_response_code()

Il est possible de récupérer ou de changer le code de la réponse http avec cette méthode :

// Récupère le code courant de la réponse
var_dump(http_response_code()); // int(200)

// Change le code de la réponse
http_response_code(404);

// Récupère notre nouveau code de réponse
var_dump(http_response_code()); // int(404)

Ajout de header_register_callback()

Cette fonction enregistre une fonction de callback qui sera appelée lorsque PHP ait préparé les en-têtes à envoyer, et avant qu’il ne les envoie. Ce qui permet une manipulation fine des en-têtes avant leur envoi.
Exemple :

header('Content-Type: text/plain');
header('X-Test: foo');

function foo() {
 foreach (headers_list() as $header) {
   if (strpos($header, 'X-Powered') !== false) {
     header_remove('X-Powered-By');
   }
   header_remove('X-Test');
 }
}

$result = header_register_callback('foo');
echo "a";

Syntaxe <?=

Cette syntaxe est désormais possible indépendamment de l’option short_tags. A méditer…

Suppressions

Options ini: register_globals, allow_call_time_pass_reference, et register_long_arrays

Toutes ces options étant dépréciées en PHP 5.3, ils sont supprimes dans 5.4.

Support des magic quotes

Les magic_quotes ne sont plus supportées depuis cette version de PHP.

Fonctions : session_is_registered(), session_register(), et session_unregister()

Ces fonctions sont aussi dépréciées dans PHP 5.3. Utilisez plutôt $_SESSION a la place.

Syntaxe break/continue $var

Ceci n’est désormais plus possible en PHP 5.4

for($i = 0; $i < 3; $i++)
{
    for($j = 0; $j < 3; $j++)
    {
        if($i == 1)
            break 2;
        echo "$i:$j\n";
    }
}

//output
0:0
0:1
0:2

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...

  • Pingback: Fonctionnalites dans PHP 5.4 (alpha release)()

  • Carlo

    Yup,

    Bon article, Cependant ton exemple n’est pas bon pour la Syntaxe break/continue $var qui a été supprimé car il est toujours valable 🙂
    Uniquement les variables dynamiques ne fonctionnerons plus . Un break/continue avec constante (1-n) fonctionnera toujours .

    Ciao