Saltar al contenido

En PHP, ¿puede crear una instancia de un objeto y llamar a un método en la misma línea?

Después de buscar en diferentes repositorios y sitios webs de internet al final descubrimos la solución que te mostramos a continuación.

Solución:

La función que ha solicitado está disponible desde 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:

Se ha agregado el acceso de miembros de clase en la creación de instancias, por ejemplo (nuevo Foo)->bar().

No puedes hacer lo que pides; pero puedes “hacer trampa”, usando el hecho de que, en PHP, puedes tener una función que tiene el mismo nombre que una clase; esos nombres no entrarán en conflicto.

Entonces, si declaraste una clase como esta:

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

A continuación, puede declarar una función que devuelva una instancia de esa clase y que tenga exactamente el mismo nombre que la clase:

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

Y ahora, es posible usar una sola línea, como usted pidió, lo único es que está llamando a la función, por lo tanto, no está usando new :

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

Y funciona: aquí, obtengo:

int 20

como salida.

Y, mejor, puedes poner algo de phpdoc en tu función:

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

De esta manera, incluso tendrá sugerencias en su IDE, al menos, con Eclipse PDT 2.x; ver la captura de pantalla:


Editar 2010-11-30: Solo a título informativo, hace unos días se envió un nuevo RFC que propone agregar esta característica a una de las futuras versiones de PHP.

Ver : Solicitud de comentarios: Llamada de instancia y método/acceso a la propiedad

Entonces, tal vez hacer cosas como estas sea posible en PHP 5.4 u otra versión futura:

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

Qué tal si:

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

:PAG

Comentarios y valoraciones del tutorial

Nos puedes añadir valor a nuestro contenido informacional colaborando tu veteranía en las acotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *