<?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?
<?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?
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);
?>
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.
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
@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
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.
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?"));
?>
¿Has probado este código? –
no, yo no. ¿Esta mal? –
'Error grave: Llamada al método indefinido stdClass :: a()' en mi cuadro 5.3. –
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.
¿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()') –
Oh, por supuesto que sí. Mecanografiado demasiado rápido. Solucionado ahora Gracias por mencionarlo. – ANisus
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 –
sí, no funciona como en javascript. – mpm
@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. –