2012-04-10 11 views
5
<?php 
$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$ar->a(); 
?> 

consigo este error La llamada al método definido¿Función de llamada de un objeto?

+1

probablemente estás jugando entre el estilo de sintaxis de javascript y el estilo de sintaxis de php .... piensa de nuevo lo que estás buscando –

+0

sí, no funciona como en javascript. – mpm

+0

@OM TheEternity closures existe en PHP (http://www.php.net/manual/en/functions.anonymous.php). La conversión de matrices en objetos es posible. La pregunta es válida y plantea un punto interesante en esa forma de hacer las cosas IMO. –

Respuesta

2

anónimo o no, que tienen una función de devolución de llamada, por lo que se necesita para manejar la situación como tal. Por ejemplo:

<?php 

$ar = (object) array(
    'a' => function(){ 
     echo 'TEST'; 
    } 
); 

call_user_func($ar->a); 

?> 
3

Actualización:

Si está usando PHP 5.3 o superior, echar un vistazo a otras respuestas por favor :)


No creo que sea la sintaxis correcta, le daría:

Parse error: syntax error, unexpected T_FUNCTION in.... 

Es necesario crear una clase, añadir método para ello, utilizar new palabra clave para crear instancias de ella y entonces usted será capaz de hacer:

$ar->a(); 

class myclass 
{ 
    public function a() 
    { 
     echo 'TEST'; 
    } 
} 

$ar = new myclass; 
$ar->a(); // TEST 

Ver Classes and Objects para más información.

+0

Pero probé Ahmed Saber está tratando de usar una función de cierre en lugar de declarar la clase de la manera en que lo hace. – ANisus

+0

@ANisus: Parece que sí, pero incluso eso daría como resultado 'Error fatal: llamada al método indefinido stdClass :: a()'. @Mukesh ha proporcionado una respuesta a continuación, veamos si esto es lo que está buscando :) – Sarfraz

0

No hay función a() pero la propiedad a, por lo que debe llamarlo por $ar->a.
De todos modos, no creo que vaya a funcionar de la manera que usted espera.

EDIT: Según lo sugerido por Álvaro G. Vicario se debe utilizar call_user_func, no echo llamar a la función y funcionará correctamente.

0

O, sólo por el gusto de hacerlo, se puede hacer algo como esto -

<?php 
$ar = new stdClass; 
$ar->a = function($to_echo){ echo $to_echo; }; 
$temp = $ar->a; 

//[Edit] - $ar->a("hello"); // doesn't work! php tries to match an instance method called  "func" that is not defined in the original class' signature 
$temp("Hey there"); 
call_user_func($ar->a("You still there?")); 
?> 
+0

¿Has probado este código? –

+0

no, yo no. ¿Esta mal? –

+0

'Error grave: Llamada al método indefinido stdClass :: a()' en mi cuadro 5.3. –

2

Por alguna razón, parece que no es posible ejecutar el cierre de la manera en que lo hace. Si modifica el código y configurar otra variable a la función, se le puede llamar:

$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$a = $ar->a; 
$a(); 

esto no es una solución. Pero por lo que puedo ver, esto parece un error o una limitación en PHP 5.3.

Estoy usando 5.3.5 al intentar esto.

+0

¿No es '$ a = $ ar-> a;' en lugar de '$ a = $ ar-> a();'? (usted toma la propiedad, que es un cierre, y luego la llama con '$ a()') –

+0

Oh, por supuesto que sí. Mecanografiado demasiado rápido. Solucionado ahora Gracias por mencionarlo. – ANisus

Cuestiones relacionadas