68 votes

PHP 5.4 - 'fermeture $ ce support'

Je vois que les nouvelles fonctionnalités prévues pour PHP 5.4: les traits de la matrice de référence, un JsonSerializable interface et quelque chose appelé 'closure $this support'

http://en.wikipedia.org/wiki/Php#Release_history

Tandis que les autres sont soit clair tout de suite (JsonSerialiable, tableau de référence) ou j'ai regardé les détails (les traits), je ne suis pas sûr de ce que la "fermeture $ce soutien". J'ai succombé à googler pour trouver quoi que ce soit à ce sujet sur php.net

Personne ne sait ce que c'est censé être?

Si je devais deviner, cela signifierait quelque chose comme ceci:

$a = 10; $b = 'strrrring';
//'old' way, PHP 5.3.x
$myClosure = function($x) use($a,$b)
             {
                 if (strlen($x) <= $a) return $x;
                 else return $b;
             };

//'new' way with closure $this for PHP 5.4
$myNewClosure = function($x) use($a as $lengthCap,$b as $alternative)
                 {
                     if(strlen($x) <=  $this->lengthCap)) return $x;
                     else 
                     {
                         $this->lengthCap++;  //lengthcap is incremented for next time around
                         return $this->alternative;
                     }
                 };

L'importance (même si cet exemple est trivial) que, dans le passé, une fois la clôture est construite de la notion "d'utiliser" les variables sont fixes. Avec fermeture $ce soutien", ils sont plus comme des membres vous pouvez salir.

Est-ce son correct et/ou de fermer et/ou raisonnable? Personne ne sait ce que cette " fermeture $ce soutien?

74voto

Gordon Points 156415

C'était déjà prévu pour PHP 5.3, mais

Pour PHP 5.3 $cette prise en charge de Fermetures a été supprimé car aucun consensus n'a pu être atteint comment la mettre en œuvre dans un esprit sain de la mode. Ce RFC décrit les possibles routes qui peuvent être prises pour mettre en œuvre dans la prochaine version de PHP.

En effet, elle signifie que vous pouvez vous référer à l'instance de l'objet (démo)

<?php
class A {
  private $value = 1;
  public function getClosure() 
  {
    return function() { return $this->value; };
  }
}

$a = new A;
$fn = $a->getClosure();
echo $fn(); // 1

Pour une discussion, voir le PHP Wiki

et pour l'intérêt historique:

53voto

igorw Points 12642

Une chose que Gordon manqué de re-liaison de l' $this. Tout ce qu'il a décrit est le comportement par défaut, il est possible de re-lier.

Exemple

class A {
    public $foo = 'foo';
    private $bar = 'bar';

    public function getClosure() {
        return function ($prop) {
            return $this->$prop;
        };
    }
}

class B {
    public $foo = 'baz';
    private $bar = 'bazinga';
}

$a = new A();
$f = $a->getClosure();
var_dump($f('foo')); // prints foo
var_dump($f('bar')); // works! prints bar

$b = new B();
$f2 = $f->bindTo($b);
var_dump($f2('foo')); // prints baz
var_dump($f2('bar')); // error

$f3 = $f->bindTo($b, $b);
var_dump($f3('bar')); // works! prints bazinga

Les fermetures bindTo méthode d'instance (vous pouvez également utiliser la statique Closure::bind) sera de retour une nouvelle fermeture avec $this re-lié à la valeur donnée. Le champ d'application est défini par l'adoption de la deuxième argument, cela permettra de déterminer la visibilité des membres privés et protégés, lors de l'accès de l'intérieur de la clôture.

22voto

Xeoncross Points 13263

En se basant sur la réponse de @ Gordon, il est possible d'imiter certains aspects de la fermeture - $ ceci en PHP 5.3.

 <?php
class A
{
    public $value = 12;
    public function getClosure()
    {
        $self = $this;
        return function() use($self)
        {
            return $self->value;
        };
    }
}

$a = new A;
$fn = $a->getClosure();
echo $fn(); // 12
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X