Lo que me gustaría hacer es algo como esto:
$method_result = new Obj()->method();
En lugar de tener que hacer:
$obj = new Obj();
$method_result = $obj->method();
El resultado no me importa en mi caso específico. Pero, ¿hay alguna manera de hacer esto?
my_method
debería declararsestatic
.Respuestas:
La función que ha solicitado está disponible en PHP 5.4. Aquí está la lista de nuevas características en PHP 5.4:
http://php.net/manual/en/migration54.new-features.php
Y la parte relevante de la lista de nuevas características:
fuente
(new Foo)->property
si lo desea.(new Foo)->property
; el valor que está almacenando no tiene a dónde ir porque el objeto ya no existirá después de eso, ya que no se almacena en ningún lado.return $this
a sus setters. Esto también te permitirá encadenar setters.No puedes hacer lo que pides; pero puede "hacer trampa", usando el hecho de que, en PHP, puede tener una función que tenga el mismo nombre que una clase; esos nombres no entrarán en conflicto.
Entonces, si declaraste una clase como esta:
Luego puede declarar una función que devuelve una instancia de esa clase, y tiene exactamente el mismo nombre que la clase:
Y ahora, es posible usar un one-liner, como usted pidió: lo único es que está llamando a la función, por lo tanto, no está usando new:
Y funciona: aquí estoy obteniendo:
como salida
Y, mejor, puedes poner algo de phpdoc en tu función:
De esta manera, incluso tendrá pistas en su IDE, al menos, con Eclipse PDT 2.x; ver el disparo:
Editar 2010-11-30: Solo para información, se envió un nuevo RFC, hace unos días, que propone agregar esta característica a una de las futuras versiones de PHP.
Ver: Solicitud de comentarios: Llamada a la instancia y método / acceso a la propiedad
Entonces, tal vez sea posible hacer cosas como estas en PHP 5.4 u otra versión futura:
fuente
Puede hacerlo de manera más universal definiendo una función de identidad:
De esa manera, no necesita definir una función para cada clase.
fuente
Qué tal si:
:PAGS
fuente
No, esto no es posible.
Debe asignar la instancia a una variable antes de poder llamar a cualquiera de sus métodos.
Si realmente no quieres hacer esto, puedes usar una fábrica como sugiere ropstah:
fuente
public static function
lugar depublic function
. ¿Se recomienda usar estática?Podría usar un método de fábrica estático para producir el objeto:
fuente
Yo también estaba buscando una frase para lograr esto como parte de una sola expresión para convertir fechas de un formato a otro. Me gusta hacer esto en una sola línea de código porque es una operación lógica única. Entonces, esto es un poco críptico, pero le permite crear instancias y usar un objeto de fecha dentro de una sola línea:
Otra forma de convertir en una línea las cadenas de fecha de un formato a otro es usar una función auxiliar para administrar las partes OO del código:
Creo que el enfoque orientado a objetos es genial y necesario, pero a veces puede ser tedioso y requiere demasiados pasos para realizar operaciones simples.
fuente
Veo que esto es bastante antiguo a medida que van las preguntas, pero aquí hay algo que creo que debería mencionarse:
El método de clase especial llamado "__call ()" se puede utilizar para crear nuevos elementos dentro de una clase. Lo usas así:
La salida debe ser:
Por lo tanto, puede engañar a PHP para que cree un "nuevo" comando dentro de su clase de nivel superior (o cualquier clase realmente) y poner su comando de inclusión en la función __call () para incluir la clase que ha solicitado. Por supuesto, es probable que desee probar $ func para asegurarse de que es un comando "nuevo" que se envió al comando __call () y (por supuesto) podría tener otros comandos también debido a cómo funciona __call ().
fuente
Simplemente podemos hacer esto
fuente