variable functions funciones example closure aws argument anonimas php ide closures anonymous-function callable

functions - Cómo codificar/referencia a funciones ejecutables de PHP fáciles de administrar para mi IDE



php function callback (2)

Cuando tengo que escribir una referencia a una función invocable, uso la sintaxis estándar de PHP definida como :

Una función de PHP se pasa por su nombre como una cadena . Cualquier función incorporada o definida por el usuario se puede usar [... omitir ...] .

Un método de un objeto instanciado se pasa como una matriz que contiene un objeto en el índice 0 y el nombre del método (cadena aka) en el índice 1.

Los métodos de clase estática también se pueden pasar sin instanciar un objeto de esa clase pasando el nombre de clase (aún una cadena) en lugar de un objeto en el índice 0.

A partir de PHP 5.2.3, también es posible pasar (la cadena) ''ClassName :: methodName'' .

Además de la función común definida por el usuario, las funciones anónimas también se pueden pasar a un parámetro de devolución de llamada.

Todas estas formas no son "compatibles con IDE" para operaciones como refactor de nombre de función o encontrar uso de .

En mi respuesta, propongo una solución, pero hay otros enfoques que se pueden aplicar, incluso totalmente diferentes, que permiten a IDE "encontrar" la invocación de los métodos.


Ya estás al lado de lo más corto que puedes hacer

Puede llamar perfectamente a su función anónima directamente en su llamada de función sin usar una variable

Por ejemplo, puedes reemplazar:

$callable=function($param) use ($object){ return $object->myMethod($param); } call_user_func($callable, $param);

por:

call_user_func(function($param) use ($object){ return $object->myMethod($param); }, $param);

Tendrá que esperar las funciones de flecha en futuras versiones de PHP, y debería poder usar algo como:

call_user_func(fn($a) => $object->myMethod($a), $param);


Me volví a una solución, siempre basada en las funciones anónimas que resuelven el problema, pero no me dejan satisfecho:

Método estático de una clase

$callable = function($param){ return /my/namespace/myClass::myMethod($param); }

método de un objeto

$callable = function($param) use ($object){ return $object->myMethod($param); }

método de $ este objeto

$callable = function($param){ return self::myMethod($param); }

Alternativas para las versiones más antiguas de php

Dentro de todas las clases a las que vas a llamar (o en sus padres) define la función classname () de la siguiente manera:

public static function className() { return get_called_class(); }

o para PHP muy antiguo:

public static function className() { return "MyClass"; }

Entonces

call_user_func(array(MyClass::className(), ''myCallbackMethod''));