2011-07-04 11 views
6

Tengo curiosidad por saber si la creación de un objeto sobre la marcha es posible en PHP. Pensé que ya lo había visto antes. Por supuesto, puedo asignarlo a una variable, pero me pregunto si esto es posible.Crear objetos sobre la marcha sin asignación variable con PHP

new className()->someMethod(); 

Por supuesto, esto arroja un error de sintaxis, así que obviamente no se hace así (si es aún posible). ¿Debería asignarlo a una variable, ya que realmente no tengo problemas para hacer eso, solo tenía curiosidad?


Solo algunos detalles más. Los métodos estáticos no son realmente una opción, ya que la clase que intentaba hacer esto era la clase ReflectionMethod de PHP.

+6

¿Has probado '(new className()) -> someMethod();'? – jerluc

+0

@jerluc: no funcionará – zerkms

+0

Sí, no funciona así ni jerluc. –

Respuesta

1

Esto solo funciona si está utilizando un patrón singleton para instanciar el objeto. Si no conoce cómo implementar el patrón singleton, tendrá que buscar en la web. Pero de esta manera sería funciona:

className::getInstance()->someMethod(); 

EDITAR

Según lo indicado por zerkms una fábrica de método también sería posible:

class ReflectionFactory 
{ 
    public static function factory($arguments) 
    { 
     return new ReflectionClass($arguments); 
    } 
} 

// Then in your code for example 
ReflectionFactory::factory()->getConstants(); 
+1

+1 Este sería el método preferido. Pero esto solo es cierto bajo el supuesto de que un singleton es apropiado para la situación del PO. – jerluc

+0

Este método es genial, pero no es posible ya que estoy tratando de hacer esto para la clase ReflectionMethod de PHP. –

+2

@jerluc: si no es apropiado, entonces la fábrica podría reemplazarlo ;-) – zerkms

0

Actualmente en php que no es posible crear una instancia de objeto nuevo e invocar sus métodos en una expresión.

Así que, obviamente, debe asignarlo a alguna variable antes.

+0

Oh bien Valió la pena el intento. :) –

0

Puede usar un método estático en una clase sin guardar una instancia de la clase en una variable.

class testClass{ 
    public static function staticMethod(){ 
     echo "Static method"; 
    } 
} 

testClass::staticMethod(); 
-1

No sé por qué PHP no permite el encadenamiento de constructores. Si realmente necesita hacer esto, intente algo como a continuación con los ajustes necesarios.

<?php 
class A { 
    public function b() 
    { 
    echo "a->B is called"; 
    } 
    public static function factory() 
    { 
    return new self; 
    } 

} 
$a = A::factory()->b(); 
?> 
9

este uso es típico en Java pero no está disponible antes de PHP 5.3. Y ahora es una nueva característica en PHP 5.4. Por favor marque PHP 5.4 new features. Y el uso debe ser:

(new Foo)->bar() 
+0

Esta es (ahora) la respuesta correcta aquí. – James

+0

¡Increíble! ¡No es necesario escribir 'create()' para cada clase! – zjuwujunchao

Cuestiones relacionadas