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 n'a pas vraiment d'importance pour moi dans mon cas spécifique. Mais, y a-t-il un moyen de faire cela?
my_method
faut plutôt le déclarerstatic
.Réponses:
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://php.net/manual/en/migration54.new-features.php
Et la partie pertinente de la liste des nouvelles fonctionnalités:
la source
(new Foo)->property
si vous le souhaitez.(new Foo)->property
- la valeur que vous stockez n'a nulle part où aller car l'objet n'existera plus après cela car il n'est stocké nulle part.return $this
à vos setters. Cela vous permettra également d'enchaîner les setters.Vous ne pouvez pas faire ce que vous demandez; mais vous pouvez "tricher", en utilisant le fait qu'en PHP, vous pouvez avoir une fonction qui a le même nom qu'une classe; ces noms ne seront pas en conflit.
Donc, si vous avez déclaré une classe comme celle-ci:
Vous pouvez ensuite déclarer une fonction qui renvoie une instance de cette classe - et qui porte exactement le même nom que la classe:
Et maintenant, il devient possible d'utiliser un one-liner, comme vous l'avez demandé - la seule chose est que vous appelez la fonction, donc n'utilisez pas new:
Et ça marche: ici, je reçois:
comme sortie.
Et, mieux, vous pouvez mettre du phpdoc sur votre fonction:
De cette façon, vous aurez même des indices 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é soumise, il y a quelques jours, qui propose d'ajouter cette fonctionnalité à l'une des futures versions de PHP.
Voir: Request for Comments: Instance et méthode call / property access
Donc, peut-être que faire des choses comme celles-ci sera possible dans PHP 5.4 ou dans une autre version future:
la source
Vous pouvez le faire plus universellement en définissant une fonction d'identité:
De cette façon, vous n'avez pas besoin de définir une fonction pour chaque classe.
la source
Que diriez-vous:
: P
la source
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:
la source
public static function
au lieu depublic function
. Est-il recommandé d'utiliser statique?Vous pouvez utiliser une méthode de fabrique statique pour produire l'objet:
la source
Moi aussi, je cherchais un one-liner pour accomplir cela dans le cadre d'une seule expression pour convertir les dates d'un format à un autre. J'aime faire cela en une seule ligne de code car c'est une seule opération logique. Donc, c'est un peu cryptique, mais cela vous permet d'instancier et d'utiliser un objet date sur une seule ligne:
Une autre façon de convertir une ligne de chaînes de date d'un format à un autre consiste à utiliser une fonction d'assistance pour gérer les parties OO du code:
Je pense que l'approche orientée objet est cool et nécessaire, mais elle peut parfois être fastidieuse, nécessitant trop d'étapes pour accomplir des opérations simples.
la source
Je vois que c'est assez ancien au fil des questions, mais voici quelque chose qui, je pense, devrait être mentionné:
La méthode de classe spéciale appelée "__call ()" peut être utilisée pour créer de nouveaux éléments à l'intérieur d'une classe. Vous l'utilisez comme ceci:
La sortie doit être:
Ainsi, vous pouvez tromper PHP en créant une "nouvelle" commande à l'intérieur de votre classe de niveau supérieur (ou de n'importe quelle classe en fait) et mettre votre commande include dans la fonction __call () pour inclure la classe que vous avez demandée. Bien sûr, vous voudrez probablement tester $ func pour vous assurer que c'est une "nouvelle" commande qui a été envoyée à la commande __call () et (bien sûr) vous pourriez avoir d'autres commandes aussi à cause du fonctionnement de __call ().
la source
Nous pouvons simplement le faire
la source