Pregunta

function t1()
{
  echo 1;
}
function t2()
{ 
  echo 2;
}

$funcs = array(t1,t2);

$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}

cuando yo haga este pequeño archivo PHP:

Aviso PHP: El uso de t1 constante indefinida - asumió 't1' en D: \ jobirn \ test \ str.php en la línea 11

Aviso PHP: El uso de t2 constante indefinida - asumió 'T2' en D: \ jobirn \ test \ str.php en la línea 11

¿Cómo puedo deshacerme de esos avisos? 12

¿Fue útil?

Solución

Usted recibe un aviso porque PHP no trata a funciones como objetos de primera clase. Al hacer esto

$functions = array(t1, t2);

El motor de PHP ve t1 y t2, y trata de resolverlo como una constante, pero debido a que no puede encontrar una constante t1 / t2 llamado, se "supone" que quería escribir array ( 'T1', 'T2 '); Si lo hace un var_dump (funciones $), se puede ver que los elementos de la matriz son cadenas.

Cuando se intenta llamar a una cadena como una función, como

$functions[0]()

PHP buscará una función con el mismo nombre que la cadena. Yo no lo llamaría esto como el uso de una cadena como un puntero de función, esto es más como el uso de la reflexión. PHP lo llama "Funciones de variables", véase:

http://hu2.php.net/manual/en /functions.variable-functions.php

Por lo tanto, la forma correcta de deshacerse de los avisos es:

$functions = array('t1', 't2');

Sobre ¿por qué

't1'();

no funciona? Desafortunadamente, no hay respuesta. Es PHP, hay un buen número de estos molestos como peculiaridades infierno. Es la misma peculiaridad como:

explode(':', 'one:two:three')[0];
Parse error: syntax error, unexpected '[' in php shell code on line 1

Editar:
La matriz mencionada referencia a la sintaxis está disponible en PHP5.4, se llama matriz de eliminación de referencias.

Otros consejos

$funcs = array('t1','t2');

poco intuitivo, pero eso es como funciona

El trabajo de todo el año a este problema es cambiar la configuración de php.ini a partir

error_reporting = E_ALL 

a

error_reporting = E_ALL & ~E_NOTICE

Salida de la función error_reporting ():

http://us2.php.net/manual/en /function.error-reporting.php

Se le permite configurar el nivel de errores, avisos y advertencias se visualizan.

Por ejemplo, si desea que los errores y las advertencias y nadie se da cuenta:

error_reporting (E_ERROR | E_WARNING);

declaraciones de cuerda si se refiere a cadenas:

$funcs = array('t1','t2');

Véase también el capítulo en funciones varaible en el manual de PHP.

para utilizar cadenas para llamar a una función, se debe utilizar llaves

'hello'() // wont work
$hello = 'hello'; $hello() // will work

editar parece { ''} () no funciona. Recuerdo que solía>. <

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top