sumador contador concatena php error-handling error-suppression

contador - php+=



Supresión de error de argumento de la función Php, emulación empty() isset() (14)

Estoy bastante seguro de que la respuesta a esta pregunta es no, pero en caso de que haya algún gurú de PHP

¿Es posible escribir una función de manera que se puedan pasar argumentos inválidos o variables no existentes y php no generará errores sin el uso de ''@''

Al igual que vacío y isset do. Puedes pasar una variable que acabas de inventar y no tendrá errores.

ex: empty($someBogusVar); // no error myHappyFunction($someBogusVar); // Php warning / notice


@Brian: utilizo una operación trinaria para hacer el control por mí:

return $value ? $value : $default;

esto devuelve $ valor O $ predeterminado. Dependiendo del valor de $ valor. Si es 0, falso, vacío o algo similar, se devolverá el valor en $ predeterminado.

Estoy más a la altura del desafío de emular funciones como empty () y isset ()


@Sean Eso ya fue respondido por Brian

return isset($input) ? $input : $default;


Estoy seguro de que podría haber una gran discusión sobre las llamadas a la función vrs de los operadores ternarios. Pero el objetivo de esta pregunta era ver si podemos crear una función que no arroje un error si se pasa un valor inexistente sin usar la ''@''


No, porque esto no tiene nada que ver con la función; el error proviene de intentar desreferenciar una clave de matriz no existente. Puede cambiar el nivel de advertencia de su configuración de PHP para eliminar estos errores, pero es mejor que no lo haga.

Habiendo dicho eso, podrías hacer algo como

function safeLookup($array, $key) { if (isset($array, $key)) return $array[$key]; return 0; }

Y úsala en lugar de la búsqueda de teclas de matriz

defaultValue(safeLookup($foo, "bar"), "baz);

Ahora necesito tomar una ducha :)


Puedes hacer esto usando func_get_args así:

error_reporting(E_ALL); ini_set(''display_errors'', 1); function defaultValue() { $args = func_get_args(); foreach($args as $arg) { if (!is_array($arg)) { $arg = array($arg); } foreach($arg as $a) { if(!empty($a)) { return $a; } } } return false; } $var = ''bob''; echo defaultValue(compact(''var''), ''alpha'') . "/n"; //returns ''bob'' echo defaultValue(compact(''var2''), ''alpha'') . "/n"; //returns ''alpha'' echo defaultValue(''alpha'') . "/n"; //return echo defaultValue() . "/n";

Este func va un paso más allá y le daría el primer valor no vacío de cualquier número de argumentos (siempre podría forzarlo a tomar solo dos argumentos, pero esto me parece más útil de esta manera).

EDITAR: la versión original no usaba compact para intentar crear una matriz de args y STILL dio un error. Los informes de error aumentaron una muesca y esta nueva versión con compacta es un poco menos ordenada, pero sigue haciendo lo mismo y le permite proporcionar un valor predeterminado para vars no existentes.


Sean, podrías hacer:

$result = ($func_result = doLargeIntenseFunction()) ? $func_result : ''no result'';

EDITAR:

Estoy seguro de que podría haber una gran discusión sobre las llamadas a la función vrs de los operadores ternarios. Pero el objetivo de esta pregunta era ver si podemos crear una función que no arroje un error si se pasa un valor inexistente sin usar la ''@''

Y te lo dije, compruébalo con isset() . La primera parte de un condicional ternario no marca nulo o no nulo, verifica true o false . Si intentas verificar true o false en un valor nulo en PHP, obtienes estas advertencias. isset() comprueba si una variable o expresión devuelve un valor nulo o no, y devuelve un valor booleano, que puede evaluarse mediante la primera parte de su ternario sin ningún error.


Y yendo más arriba en el árbol de la abstracción, ¿para qué estás usando esto?

Puede inicializar esos valores en cada clase según corresponda o crear una clase específica que contenga todos los valores y atributos predeterminados, como:

class Configuration { private var $configValues = array( ''cool'' => ''Defaultcoolval'' , ''uncool'' => ''Defuncoolval'' ); public setCool($val) { $this->configValues[''cool''] = $val; } public getCool() { return $this->configValues[''cool'']; } }

La idea es que, al usar la función defaultValue en todas partes hacia arriba y hacia abajo en tu código, se convertirá en una pesadilla de mantenimiento cada vez que tengas que cambiar un valor, buscando todos los lugares donde has puesto una llamada DefaultValue. Y probablemente también te lleve a repetirte, violando DRY.

Mientras que este es un lugar único para almacenar todos esos valores predeterminados. Puede sentirse tentado de evitar crear esos setters y getters, pero también ayudan en el mantenimiento, en caso de que sea pertinente realizar alguna modificación de los resultados o la validación de las entradas.


No se produce ningún error cuando la variable se pasa por referencia (PHP creará nueva variable de forma silenciosa):

function myHappyFunction(&$var) { }

Pero recomiendo no abusar de esto para ocultar los errores de programación.


Si bien la respuesta a la pregunta original es "no", hay opciones que nadie ha mencionado.

Cuando usas el signo @, todo lo que hace PHP es anular el nivel de error_reporting y establecerlo temporalmente a cero. Puede usar " ini_restore(''error_reporting''); " para volver a establecerlo antes de que se haya utilizado @.

Esto fue útil para mí en la situación en la que quería escribir una función de conveniencia para verificar y ver si una variable estaba configurada, y también tenía otras propiedades; de lo contrario, devolvía un valor predeterminado. Pero enviar una variable no configurada provocó un aviso de PHP, por lo que utilicé @ para suprimir eso, pero luego devolví error_reporting al valor original dentro de la función.

Algo como:

$var = @foo($bar); function foo($test_var) { ini_restore(''error_reporting''); if(is_set($test_var) && strlen($test_var)) { return $test_var; } else { return -1; } }

Entonces, en el caso anterior, si $bar no está configurado, no recibiré un error cuando llame a foo() con una variable inexistente. Sin embargo, obtendré un error dentro de la función donde is_set erróneamente is_set lugar de isset .

Esta podría ser una opción útil que cubra lo que la pregunta original hacía en espíritu, si no en realidad.


¿Es posible escribir una función de manera que se puedan pasar argumentos inválidos o variables no existentes y php no generará errores sin el uso de ''@''?

¡Sí tu puedes!

porneL es correcto [editar: no tengo suficientes puntos para vincular a su respuesta o votarlo, pero está en esta página]

También tiene razón cuando advierte "Pero recomiendo no abusar de esto para ocultar los errores de programación". sin embargo, la supresión de errores a través del operador de control de errores (@) también debe evitarse por este mismo motivo.

Soy nuevo en , pero espero que no sea común que una respuesta incorrecta se clasifique como la más alta en una página, mientras que la respuesta correcta no recibe votos. :(


Si simplemente agrega un valor predeterminado al parámetro, puede omitirlo cuando llame a la función. Por ejemplo:

function empty($paramName = ""){ if(isset($paramName){ //Code here } else if(empty($paramName)){ //Code here } }


Existen casos válidos en los que la verificación se vuelve engorrosa y poco sincera.
Por lo tanto, he escrito esta pequeña función mágica:

/** * Shortcut for getting a value from a possibly unset variable. * Normal: * if (isset($_GET[''foo'']) && $_GET[''foo''] == ''bar'') { * Short: * if (value($_GET[''foo'']) == ''bar'') { * * @param mixed $variable * @return mixed Returns null if not set */ function value(&$variable) { if (isset($variable)) { return $variable; } }

No requiere ningún cambio en myHappyFunction ().
Tendrás que cambiar

myHappyFunction($someBogusVar);

a

myHappyFunction(value($someBogusVar));

Estableciendo su intención explícitamente. lo que lo hace una buena práctica en mi libro.


Con una sola línea, puede completarla: myHappyFunction($someBogusVar="");

Espero que esto es lo que estás buscando. Si lee la documentación de php, en los valores de argumento predeterminados , puede ver que la asignación de un valor predeterminado al argumento de una función le ayuda a evitar un mensaje de error al usar funciones.

En este ejemplo, puede ver la diferencia de usar un argumento predeterminado y sus ventajas:

Código PHP:

<?php function test1($argument) { echo $argument; echo "/n"; } function test2($argument="") { echo $argument; echo "/n"; } test1(); test1("Hello"); test1($argument); $argument = "Hello world"; test1($argument); test2(); test2("Hello"); test2($argument); $argument = "Hello world"; test2($argument); ?>

Salida para líneas test1() :

Advertencia : falta el argumento 1 para test1 ().
Hola.
.
Hola Mundo.

Salida para líneas test2() :

.
Hola.

Hola Mundo.

Esto también se puede usar en combinación con isset() y otras funciones para lograr lo que desea.


Resumiendo, la respuesta correcta es no, no deberías (mira la advertencia a continuación).

Existen soluciones temporales ya mencionadas por muchas personas en este hilo, como el uso de variables de referencia o isset () o empty () en condiciones y supresión de avisos en la configuración de PHP. Eso además de la solución obvia, el uso de @, que no desea.

Resumiendo una discusión de comentario interesante con Gerry : Pasar la variable por referencia es de hecho válido si comprueba el valor de la variable dentro de la función y maneja casos indefinidos o nulos correctamente. Simplemente no use el paso de referencia como una forma de cerrar PHP (aquí es donde mi original no debería apuntar).