139 votes

En PHP, pouvez-vous instancier un objet et appeler une méthode sur la même ligne?

Ce que je voudrais faire est quelque chose comme ceci:

 $method_result = new Obj()->method();
 

Au lieu d'avoir à faire:

 $obj = new Obj();
$method_result = $obj->method();
 

Le résultat ne compte pas vraiment pour moi dans mon cas particulier. Mais, y a-t-il un moyen de faire cela?

183voto

Delian Krustev Points 603

La fonctionnalité que vous avez demandée est disponible à partir de PHP 5.4. Voici la liste des nouvelles fonctionnalités de PHP 5.4:

http://docs.php.net/manual/fr/migration54.new-features.php

Et la partie pertinente de la liste des nouvelles fonctionnalités:

L’accès des membres de classe à l’instanciation a été ajouté, par exemple (nouveau Foo) -> bar ().

37voto

Pascal MARTIN Points 195780

Vous ne pouvez pas faire ce que vous demandez ; mais vous pouvez "tricher", en utilisant le fait que, en PHP, vous pouvez avoir une fonction qui a le même nom qu'une classe ; ces noms n'entre pas en conflit.

Donc, si vous avez déclaré une classe comme ceci :

class Test {
    public function __construct($param) {
        $this->_var = $param;
    }
    public function myMethod() {
        return $this->_var * 2;
    }
    protected $_var;
}

Vous pouvez déclarer une fonction qui retourne une instance de cette classe -- et a exactement le même nom que la classe :

function Test($param) {
    return new Test($param);
}

Et maintenant, il devient possible d'utiliser un one-liner, comme vous l'avez demandé -- la seule chose c'est que vous êtes l'appel de la fonction, donc pas à l'aide de nouveau :

$a = Test(10)->myMethod();
var_dump($a);

Et ça fonctionne : ici, j'obtiens :

int 20

en sortie.


Et, mieux, vous pouvez mettre un peu de phpdoc sur votre fonction :

/**
 * @return Test
 */
function Test($param) {
    return new Test($param);
}

De cette façon, vous aurez même des astuces dans votre IDE -- au moins, avec Eclipse PDT 2.x ; voir le screeshot :



Edit 2010-11-30 : Juste pour information, une nouvelle RFC a été soumis, il y a quelques jours, qui propose d'ajouter cette fonctionnalité à l'une des prochaines versions de PHP.

Voir : Demande de Commentaires: l'Instance et de l'appel de la méthode/de l'accès à la propriété

Alors, peut-être faire des choses comme celles-là sera possible en PHP 5.4 ou une autre version future :

(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]

19voto

tomp Points 1170

Vous pouvez le faire de manière plus universelle en définissant une fonction d'identité:

 function identity($x) {
    return $x;
}

identity(new Obj)->method();
 

De cette façon, vous n'avez pas besoin de définir une fonction pour chaque classe.

19voto

Jeff Points 443

Que diriez-vous:

$ obj = new Obj (); $ method_result = $ obj-> method (); ?

: P

16voto

Pim Jager Points 20018

Non, ce n'est pas possible.
Vous devez affecter l'instance à une variable avant de pouvoir appeler l'une de ses méthodes.

Si vous ne voulez vraiment pas faire cela, vous pouvez utiliser une usine comme le suggère ropstah:

 class objFactory{
  public static function newObj(){
      return new Obj();
  }
}
objFacotry::newObj()->method();
 

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