usar - Llamada de método estático dinámico en PHP?
var static php (9)
Por favor, alguien con experiencia en PHP podría ayudar con lo siguiente. En algún lugar de mi código, tengo una llamada a un método público estático dentro de una clase no instanciada:
$result = myClassName::myFunctionName();
Sin embargo, me gustaría tener muchas de esas clases y determinar el nombre correcto de la clase sobre la marcha según el idioma del usuario. En otras palabras, tengo:
$language = ''EN'';
... y necesito hacer algo como:
$result = myClassName_EN::myFunctionName();
Sé que podría pasar el idioma como un parámetro para la función y tratarlo dentro de una sola clase común, pero por diversas razones, preferiría una solución diferente.
¿Tiene esto sentido, alguien? Gracias.
Como dijo temuri, se produce un error de análisis al intentar ''$ className :: functionName'':
Error de análisis: error de sintaxis, inesperado T_PAAMAYIM_NEKUDOTAYIM ...
En mi caso (método estático con 2 argumentos), la mejor solución es usar call_user_func_array con 2 arrays (como lo sugiere nikc.org):
$result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
BR
Encapsularía la creación de la clase que necesitas en una fábrica.
De esta forma, tendrá un solo punto de entrada cuando necesite cambiar su nombre base o las reglas para asignar el idioma a la clase correcta.
class YourClassFactory {
private $_language;
private $_basename = ''yourclass'';
public YourClassFactory($language) {
$this->_language = $language;
}
public function getYourClass() {
return $this->_basename . ''_'' . $this->_language;
}
}
y luego, cuando tienes que usarlo:
$yourClass = $yourClassFactoryInstance->getYourClass();
$yourClass::myFunctionName();
Por lo que pude entender su pregunta, necesita obtener el nombre de la clase que se puede hacer usando la función get_class . Por otro lado, la clase Reflection puede ayudarte aquí, lo cual es excelente cuando se trata de métodos, argumentos, etc. en forma de OOP.
Puedes hacer lo siguiente fácilmente:
<?php
class B {
public static $t = 5;
public static function t($h) {
return "Works!" . $h;
}
}
$g = ''t'';
$class = ''B'';
echo $class::$g(''yes''); //Works! Yes
Y funcionará bien, probado en PHP 5.2> =
Sé que es un hilo viejo, pero a partir de PHP 5.3.0 debería usar forward_static_call
$result = forward_static_call(array(''myClassName_EN'', ''myFunctionName''));
Usando su variable de $ language, podría verse así:
$result = forward_static_call(array(''myClassName_'' . $language, ''myFunctionName''));
Soluciones como:
$yourClass::myFunctionName();
no trabajará. PHP producirá un error de análisis.
Desafortunadamente, la única forma es usar call_user_func()
muy lento .
Use la función call_user_func :
Ejemplo:
call_user_func(''myClassName_'' . $language . ''::myFunctionName'');
aunque creo que la forma en que tratas es una muy mala idea, creo que puedo tener una solución
$className = ''myClassName_''.$language;
$result = $className::myFunctionName();
Creo que esto es lo que quieres
Creo que podrías hacer:
$classname = ''myClassName_'' . $language;
$result = $classname::myFunctionName();
Esto se llama Funciones Variables