Asignar una función estática a una variable

¿Hay alguna forma de asignar una función estática a una variable o de lograr esto de alguna otra manera?

class my_class{
     public static function my_method($a){
        return $a;
     }
}

$some_func = my_class::my_method;

$someAnonFunc = function($a) use ($some_func){
    return $some_func($a);
}

$inst = new SomeOtherClass(); //Defined somewhere else, in some other file

$inst->someMethod($a, $someAnonFunc);

En este punto, obtengo:

Error fatal: constante de clase indefinida 'mi_método'

preguntado el 10 de septiembre de 12 a las 22:09

¿Por qué quieres tal cosa? Puede llamar a métodos estáticos dentro de funciones lambda sin ningún problema. -

El $someAnonFunc se pasará como un parámetro al método de otra clase, que no tiene conocimiento del método estático. Por supuesto, podría incluir el archivo de clase, pero me parece que mi enfoque es más limpio y más reutilizable, si es posible hacerlo:

quieres escuchar sobre Los espacios de nombres. -

Ok, supongo que JavaScript está más cerca de un lenguaje funcional que PHP... ¿No es el espacio de nombres otra forma de "incluir" definiciones de clase? Realmente estoy buscando una manera de tener algún tipo de "puntero" a una función, llamada desde cualquier lugar. -

@BinaryDeuce: JavaScript is un lenguaje funcional, no cercano a, es is -

3 Respuestas

Las funciones no son de primera clase en PHP... las cadenas sí lo son. tendrías que usar call_user_func si quisieras quedarte con el :: sintaxis como una unidad:

$some_func = 'my_class::my_method';
$someAnonFunc = function ($a) use ($some_func) {
   return call_user_func($some_func, $a);
}

Tratando de correr $some_func() no funcionará ya que tratará los dos puntos como parte del nombre de la función.

Respondido el 10 de Septiembre de 12 a las 22:09

Esta no era mi pregunta pero aprendí algo aquí - gracias :) - MazB

+1 para Las funciones no son de primera clase en PHP Lenguajes funcionales: JavaScript, Lisp, Scheme, Haskell, ... No PHP, Perl, Java o cualquiera de la familia C. Esa es una gran diferencia y la gente debemos saber - Elias Van Ootegem

+1 Usé tu solución. Tuve que requerir_una vez la primera clase en la segunda, lo que quería evitar pero no pude - BinaryDeuce

No estoy seguro de haber entendido correctamente su pregunta, pero ¿está buscando call_user_func?

Puedes llamar al método estático usando

call_user_func(array('myclass', 'my_method'), $arg1, $arg2, ...);

Respondido el 10 de Septiembre de 12 a las 22:09

No he probado esto yo mismo, pero intente

$some_func = 'my_class::my_method';

(por ejemplo, asigne la clase/método como una cadena).

Puede que esto no funcione como está, pero sé que algo como:

$x = 'mysql_real_escape_string';

$sql = "INSERT ... VALUES({$x($_GET['post'])})";

lo hace. Feo, pero funciona.

Respondido el 10 de Septiembre de 12 a las 22:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.