2012-04-12 4 views
8

Pregunta bastante simple realmente, ¿cómo paso vars indefinidos a funciones sin errores E_NOTICE?¿Cómo paso vars indefinidos a funciones sin errores E_NOTICE?

Al pasar variables no definidas a funciones como isset(), no se produce ningún error, pero enviar el mismo a su propia función y obtendrá un Notice: Undefined offset: etc.

he pensado algunas razones para desear esto hoy, pero mi función actual es casi un clon de isset, excepto que comprobará si de los argumentos están configurados, en lugar de todos los que hace isset (a, b, c).

function anyset() 
{ 
    $argc = func_num_args(); 
    $argv = func_get_args(); 
    for ($i = 0; $i < $argc; $i++) 
     if (isset($argv[$i])) return true; 
    else return false; 
} 

Ahora, tengo por ejemplo una matriz 2D gigante de [x] [y], en la que se colocarán los valores al azar. Necesito verificar que los co-ords aleatorizados contengan algo "próximo" a él (x-1, y-1 a x + 1, y + 1) etc.

No quiero hacer un bucle de 20,000,000 y inicializa cada variable. Solo quiero enviar 9 vars y verificar si alguno ya está configurado.

while (anyset($items[$x-1][$y-1],$items[$x][$y-1],$items[$x+1][$y-1], 
       $items[$x-1][$y],$items[$x][$y],$items[$x+1][$y], 
       $items[$x-1][$y+1],$items[$x][$y+1],$items[$x+1][$y+1])); 

Like so.

Podría hacer isset (x) || isset (x) || isset (x) pero eso no se ve muy bien.

¿Hay alguna manera de permitir que variables indefinidas pasen a mi función sin generar errores?

No está interesado en tomar la opción fácil;)

Gracias por leer!

\ o

Actualización: 12 de abril 2012, 21:03 Parece que no hay ninguna característica especial que permite que esto suceda. Así que, o pasan como anyset (@ $ array [0], @ $ array [1]), etc, o simplemente envolver todo en un millar de issets así:

while (isset($items[$x-1][$y-1]) || isset($items[$x][$y-1]) || isset($items[$x+1][$y-1]) || 
     isset($items[$x-1][$y]) || isset($items[$x][$y]) || isset($items[$x+1][$y]) || 
     isset($items[$x-1][$y+1]) || isset($items[$x][$y+1]) || isset($items[$x+1][$y+1])); 

Espero que esto ayude a alguien más en el futuro!

+1

Una idea simple, simplemente agregue el error-neutralizador @ justo antes de la función de generación de errores? '$ result = @youFunction()' – Claaker

Respuesta

7

tiene tres opciones:

  • uso isset para manejar adecuadamente la lógica (isset ($ x) || isset ($ y) || isset ($ z))
  • envolver todo en isset() y luego haga que su función comprueba si alguno de los me lo quitaron son verdaderas (tipo de bleh)
  • uso @ para suprimir errores (también bLEH)

Un ejemplo de @ sería:

function a($a) { } a(@$x); 

No obstante, debe recordar que los avisos existen por algún motivo. Evito la supresión de errores. Me parece raro. Simplemente, envolvería todo correctamente en isset(). Es mucho más detallado, pero también, en mi opinión de todos modos, más correcto.

+0

Ya veo, pensé en eso, pero también pensé que era un poco hacky. Pensé que podría haber alguna forma mágica de permitir que variables indefinidas pasen como null/unset. No hay problema, supongo que usaré 9 issets! Gracias. –

+0

@AdamKDean Bueno, siempre existe la opción de ajustar el nivel de informe de errores. Lo habría mencionado como una opción, excepto que no es específico de esta sección de código. Sería específico para toda la ejecución del código. Por ejemplo error_reporting (E_ALL^​​E_NOTICE); ignoraría los avisos. El problema sería sin embargo, ignoraría * todos * avisos, no solo usando una variable indefinida. Podría envolver solo la llamada a la función en error_reporting() y luego revertir el informe de errores a la normalidad, pero eso me parece incluso más complicado. – Corbin

+0

@AdamKDean, otra opción sería añadir un prefijo a la función completa con @. Pensé que tenía que prefijar cada variable individualmente, pero simplemente probé la sugerencia de Claaker en los comentarios, y aparentemente puede prefijar toda la función para suprimir los avisos. Aunque esto podría tener algunos errores que no quieres decir. – Corbin

1

isset es un poco especial, ya que en realidad es una construcción de lenguaje PHP en lugar de una función [1].

Si una variable no está definida, no se puede pasar porque no está definida (de ahí la advertencia).

Como se indica en los comentarios, puede suprimir las advertencias al anteponer un @ a la variable que evitará que se emita una advertencia si no está configurado. Luego, dentro de la función puede verificar si el valor es nulo o intentar usar isset para ver si está registrado.

+0

Interesante, no estaba enterado de eso, aunque consideré que podría ser una función incorporada especial. Buggger. Gracias de todos modos, supongo que los issets tendrán que ser el camino a seguir. –

-1

Tal vez algo como esto funcione para usted? Es un poco hackish, pero creo que lo que quieres no es posible sin una evaluación perezosa de los argumentos de la función.

if (atLeastOneIsSet($myArray, 1, 3, 4, 6)) doSomething(); 

function atLeastOneIsSet(array $arr) { 
    $args = func_get_args(); 
    for ($i = 1; $i < func_num_args(); ++$i) 
     if (isset($arr[$args[$i]])) return true; 
    return false; 
} 

Editar: oops, logic issues.

+0

Configurar esto para trabajar con una matriz de 2d lo haría peor que solo usar issets. ¿Puedes imaginar atLeastOneIsSet ($ array, array (0,0), array (1,0), array (1,1)), etc.? Gracias, concepto interesante! –

+1

@AdamKDean Vaya, creo que tenía demasiada prisa por publicar. ¡Estas malditas preguntas PHP siempre me hacen sentir tan apurado! – Tim

6

Pasar por referencia funcionará para argumentos definidos.

function my_isset(&$k) { ... } 

$bool = my_isset($_POST['hi']); 
+0

Eso aún arrojará un aviso si la clave 'hi' de $ _POST no existe. – Corbin

+0

Pero, ¿cómo funcionaría eso con func_get_args? –

+1

Si se pasa por referencia (&), no lanzará un aviso. Esto no funcionará con func_get_args. Podría tratar de usar debug_backtrace, pero se seguirá activando un aviso – Nate