Valor vacío en php. Hoja de trucos para PHP: FALSE, NULL y valores asociados a ellos. PHP vacío() para objetos y matrices

La programación moderna ha manipulado con éxito variables sin tipo durante mucho tiempo. El tipo de variable no se puede especificar de antemano y se puede cambiar durante la ejecución del programa.

Este concepto se ha vuelto central para el paradigma de programación general. Al comienzo de la era de la programación, los lenguajes con la misma confianza exigían que el programador predefiniera variables y se aseguraban estrictamente de que no se les asignara nada ilegal. Ni los programas ni los lenguajes de programación tenían idea antes de que una variable cambia de tipo.

Sobre lo vacío y lo inexistente

La función PHP vacía() es la inversa de la función isset() y tiene algunas características de uso especiales. Si no hay ninguna variable, entonces la primera función responde positivamente y su resultado es verdadero, y la segunda responde negativamente, es decir, su valor será falso.

Por definición, isset() está diseñado para comprobar la existencia de una variable. No importa qué y cómo se asignó la variable, lo principal es que exista y no sea destruida por la función unset(). El resultado de la función isset() será positivo: verdadero. Es importante recordar que si $iVar = 0; entonces isset($iVar) será verdadero, pero vacío($iVar) también será verdadero.

En el primer caso, el resultado significa que la variable existe, en el segundo caso, la variable está vacía, es decir, el valor “0” en cualquier forma, ya sea una cadena (“0”) o un número (fraccional - 0.0 o entero - 0) es lo mismo: vacío ($iVar) será verdadero.

Sobre seguridad y control

La práctica muestra que los lenguajes sin tipo le dan mucha más libertad al programador, pero asumen que su actitud al trabajar en el algoritmo es más responsable.

PHP ofrece una sintaxis moderna que soporta la semántica establecida, tiene pocos errores, pero requiere atención cuidadosa. Por ejemplo, llamar a cualquier función requiere una cierta cantidad de parámetros.

Al llamar a una función, no es necesario pasar todos los parámetros; solo se puede pasar una parte importante de ellos. La función "debe" comprobar la presencia y existencia de todos los parámetros. Aquellos que falten o tengan valores incorrectos deben restaurarse a su forma normal y asignarles los valores requeridos.

En este contexto, la función PHP vacía() es esencial. Expresión:

$a = "1;2" + 20

asignará a la variable $a el valor 21, ya que la primera parte de la expresión se representará como 1, y la segunda será 20.

El resultado será de tipo número y la función PHP vacía($a) tendrá el resultado falso, es decir, la variable $a no está vacía.

En este contexto, teniendo una función:

pruebafuncional($a = 0, $b = 20)

Al llamar:

$res = pruebafuncional($aVal, $bVal)

tendrá lo que se desea, es decir, el resultado de la función. Y cuando lo llaman:

  • $res = pruebafuncional($aVal. $bVal)

El cuerpo de la función contiene solo un parámetro con el valor "$aVal. $bVal" y lo más probable es que este parámetro se interprete como una cadena de caracteres.

PHP vacío() para objetos y matrices

La sintaxis del lenguaje tiene una cantidad suficiente de construcciones y funciones para trabajar con objetos y matrices, pero desde el punto de vista de verificar su existencia y la presencia de un valor, no existen diferencias especiales con las variables.

PHP vacío (matriz): equivalente a llamar vacío (variable simple). Sin embargo, existen consideraciones muy importantes respecto a los objetos. En cuanto a comprobar la existencia de un objeto (isset), la pregunta apenas tiene sentido. En cuanto a la función PHP vacía(), la conveniencia de su uso sigue siendo cuestionable.

Según la lógica de la programación orientada a objetos, un objeto tiene su propio contenido y su propio conjunto de métodos. Sólo el objeto en sí puede decir si está vacío o no, pero no una función de terceros, incluso si es parte de la sintaxis del lenguaje.

Un objeto y su función vacía()

Sobre esta base simple pero legítima, cada objeto debe considerarse en el contexto de su comprensión del “vacío”. Por ejemplo, la implementación del objeto "Tabla de personal" consta de registros de "Empleado". Pero si no hay un solo empleado, en la "Lista de personal" siempre hay opciones para los puestos de empleados potenciales.

¿A qué nivel debería utilizar la función de objeto vacío de PHP aquí? En el nivel "Staffing", todo existe, incluso si no hay un solo empleado. En el nivel "Empleado", el objeto ya existe, aunque no esté completamente lleno. Un objeto que no está completamente lleno se puede clasificar como objeto vacío. No hay ningún beneficio para la plantilla.

Dependiendo de su estilo de programación, las funciones PHP vacías() e isset() son muy importantes para construir un algoritmo seguro y confiable, pero para objetos es mejor tener una variante de vacía() definida por su contenido.

En PHP, los valores FALSE y NULL y sus valores asociados son diferentes de como suelen ser en otros lenguajes y tienen sus propias características no obvias.
El artículo analiza estas características.
Para los principiantes, esto puede ser útil para ver la imagen completa, para los lectores experimentados, para actualizar su memoria si se les ha olvidado algún matiz.

FALSO en declaraciones If

Según la documentación de PHP, los siguientes valores son FALDOS después de convertirlos a booleanos:
  • el valor booleano en sí es FALSO
  • una cadena vacía ("") y la cadena "0".
  • matriz vacía (matriz) – matriz().
  • un objeto con cero variables miembro (solo PHP 4, no cubierto en este artículo)
  • valor NULL especial (incluidas las variables no configuradas)
  • Objetos SimpleXML (no tratados en este artículo)
Esto significa que si se pasan dichos valores a la condición:
si (…) haga eco de “1”; de lo contrario, haga eco de "0";
entonces se imprimirá la cadena "0".

Si el valor de la variable no está establecido (desestablecido), también se puede emitir una advertencia. Le recordamos que la advertencia en la condición se puede eliminar escribiendo @ antes de la variable.

Por ejemplo:

Si (@$undefVar) (…)
Pero debe usar @ solo en casos extremos, cuando lo haya pensado detenidamente y no haya otras opciones adecuadas. Ver función isset().

La función is_null() y las construcciones del lenguaje isset() y vacío()

is_null() devuelve TRUE solo para variables a las que no se les asigna ningún valor o a las que se les asigna el valor NULL.
isset() devuelve valores booleanos uno a uno en comparación con is_null() .
Si a la variable no se le asigna un valor, entonces is_null() también emite una advertencia de "Variable no definida", a diferencia de isset(), que no emite ninguna advertencia.
Recuerde que para eliminar el valor de una variable, puede utilizar la función unset(). También puede asignar el valor NULL para este propósito para evitar advertencias del compilador al intentar leer el valor de una variable.

Tenga en cuenta que, a diferencia de las variables, para trabajar con constantes debe utilizar la construcción definida().

Representación de cadenas

Veamos la representación en cadena de constantes falsas.
Por ejemplo, la concatenación convierte los valores en las siguientes cadenas, como se muestra en la siguiente tabla:

El tema de la conversión a cadenas se describe con más detalle en el sitio web oficial en el párrafo Conversión a cadenas.

Operadores de comparación

Pasemos a los operadores de comparación.
Todos los valores falsos devuelven verdadero, como se esperaba, en comparación con FALSO usando el operador " == ".
Pero aquí no debes confiar en la transitividad al comparar constantes de cadena falsas entre sí.
Aquí hay una tabla completa para comparar valores falsos (más denota elementos de la tabla que, cuando se comparan usando el operador "!=", devuelven un valor verdadero:

$undef – una variable a la que no se le ha asignado un valor

De la tabla se pueden sacar algunas conclusiones agradables:
1. Si sabemos que solo usamos cadenas, entonces podemos compararlas con seguridad y no preocuparnos de que "" (una cadena vacía) sea igual a "0".
2. Las matrices nunca son iguales a cadenas, números enteros o números reales.

Dado que los tipos de diferentes constantes falsas son diferentes, se pueden usar un par de operadores === y !== para distinguirlas.
El operador === devuelve falso para todos los pares de valores falsos.
Devuelve un valor verdadero solo para argumentos a uno de los cuales se le asigna el valor NULL y al segundo no se le asigna ningún valor.

Diferencia entre variables con valor NULL y variables indefinidas

El operador === le permite distinguir entre todos los valores falsos, excepto las variables con un valor NULL de las variables a las que no se les ha asignado un valor.

Estas variables se pueden distinguir utilizando la función get_defined_vars().

Si necesita determinar si se ha asignado un valor a la variable $var, se puede utilizar el siguiente fragmento de código para hacerlo:
if (array_key_exists("var", get_defined_vars())) ( echo "var está definido"; // a $var se le asigna NULL ) else ( echo "var NO está definido"; // $var no está definido o no está definido($ var) fue llamado)

conclusiones

Siempre debes recordar que en PHP, dos valores falsos pueden no ser iguales entre sí, y las variables que parecen diferentes a primera vista pueden resultar iguales al compararlas. Para evitar este tipo de sorpresas, puede utilizar los operadores === y !==.

Cuando trabaje con matrices, para evitar sorpresas, puede escribir una función para convertir valores en índices diferentes garantizados. Después de eso, solo se puede acceder a los elementos de la matriz usándola. Esto puede ralentizar el programa, pero ayudará a evitar sorpresas.

En PHP, los valores FALSE y NULL y sus valores asociados son diferentes de como suelen ser en otros lenguajes y tienen sus propias características no obvias.
El artículo analiza estas características.
Para los principiantes, esto puede ser útil para ver la imagen completa, para los lectores experimentados, para actualizar su memoria si se les ha olvidado algún matiz.

FALSO en declaraciones If

Según la documentación de PHP, los siguientes valores son FALDOS después de convertirlos a booleanos:
  • el valor booleano en sí es FALSO
  • una cadena vacía ("") y la cadena "0".
  • matriz vacía (matriz) – matriz().
  • un objeto con cero variables miembro (solo PHP 4, no cubierto en este artículo)
  • valor NULL especial (incluidas las variables no configuradas)
  • Objetos SimpleXML (no tratados en este artículo)
Esto significa que si se pasan dichos valores a la condición:
si (…) haga eco de “1”; de lo contrario, haga eco de "0";
entonces se imprimirá la cadena "0".

Si el valor de la variable no está establecido (desestablecido), también se puede emitir una advertencia. Le recordamos que la advertencia en la condición se puede eliminar escribiendo @ antes de la variable.

Por ejemplo:

Si (@$undefVar) (…)
Pero debe usar @ solo en casos extremos, cuando lo haya pensado detenidamente y no haya otras opciones adecuadas. Ver función isset().

La función is_null() y las construcciones del lenguaje isset() y vacío()

is_null() devuelve TRUE solo para variables a las que no se les asigna ningún valor o a las que se les asigna el valor NULL.
isset() devuelve valores booleanos uno a uno en comparación con is_null() .
Si a la variable no se le asigna un valor, entonces is_null() también emite una advertencia de "Variable no definida", a diferencia de isset(), que no emite ninguna advertencia.
Recuerde que para eliminar el valor de una variable, puede utilizar la función unset(). También puede asignar el valor NULL para este propósito para evitar advertencias del compilador al intentar leer el valor de una variable.

Tenga en cuenta que, a diferencia de las variables, para trabajar con constantes debe utilizar la construcción definida().

Representación de cadenas

Veamos la representación en cadena de constantes falsas.
Por ejemplo, la concatenación convierte los valores en las siguientes cadenas, como se muestra en la siguiente tabla:

El tema de la conversión a cadenas se describe con más detalle en el sitio web oficial en el párrafo Conversión a cadenas.

Operadores de comparación

Pasemos a los operadores de comparación.
Todos los valores falsos devuelven verdadero, como se esperaba, en comparación con FALSO usando el operador " == ".
Pero aquí no debes confiar en la transitividad al comparar constantes de cadena falsas entre sí.
Aquí hay una tabla completa para comparar valores falsos (más denota elementos de la tabla que, cuando se comparan usando el operador "!=", devuelven un valor verdadero:

$undef – una variable a la que no se le ha asignado un valor

De la tabla se pueden sacar algunas conclusiones agradables:
1. Si sabemos que solo usamos cadenas, entonces podemos compararlas con seguridad y no preocuparnos de que "" (una cadena vacía) sea igual a "0".
2. Las matrices nunca son iguales a cadenas, números enteros o números reales.

Dado que los tipos de diferentes constantes falsas son diferentes, se pueden usar un par de operadores === y !== para distinguirlas.
El operador === devuelve falso para todos los pares de valores falsos.
Devuelve un valor verdadero solo para argumentos a uno de los cuales se le asigna el valor NULL y al segundo no se le asigna ningún valor.

Diferencia entre variables con valor NULL y variables indefinidas

El operador === le permite distinguir entre todos los valores falsos, excepto las variables con un valor NULL de las variables a las que no se les ha asignado un valor.

Estas variables se pueden distinguir utilizando la función get_defined_vars().

Si necesita determinar si se ha asignado un valor a la variable $var, se puede utilizar el siguiente fragmento de código para hacerlo:
if (array_key_exists("var", get_defined_vars())) ( echo "var está definido"; // a $var se le asigna NULL ) else ( echo "var NO está definido"; // $var no está definido o no está definido($ var) fue llamado)

conclusiones

Siempre debes recordar que en PHP, dos valores falsos pueden no ser iguales entre sí, y las variables que parecen diferentes a primera vista pueden resultar iguales al compararlas. Para evitar este tipo de sorpresas, puede utilizar los operadores === y !==.

Cuando trabaje con matrices, para evitar sorpresas, puede escribir una función para convertir valores en índices diferentes garantizados. Después de eso, solo se puede acceder a los elementos de la matriz usándola. Esto puede ralentizar el programa, pero ayudará a evitar sorpresas.

Las pruebas se realizaron en PHP 5.3.1.

Enlaces adicionales

1. Tablas comparativas de tipos PHP.
2. Cadenas nulas y vacías de MySQl en el contexto de PHP.

Etiquetas: Agregar etiquetas

Si, cuando trabaja con cadenas, necesita comprobar si una cadena está vacía, los programadores principiantes suelen utilizar la función strlen(). Esta función es bastante rápida porque no realiza ningún cálculo, sino que simplemente devuelve el valor ya conocido de la longitud de la cadena, disponible en zval (PHP usa una estructura C para almacenar variables). Pero aún así, porque strlen()- esta es una función, es un poco lenta porque requiere varias acciones cuando se llama, como convertir a minúsculas y buscar en la tabla hash. En algunos casos, puede aumentar la velocidad de ejecución de su código usando vacío()..., pero también vacío() Aún puedes optimizarlo un poco.

Tomemos un ejemplo Por ejemplo comprobando la ruta de la imagen, la función comprueba si la ruta está vacía y luego la reemplaza con otra ruta, por ejemplo “images/noimage.jpg”.

Y entonces toda la tarea se reduce a comprobar si una variable de tipo cadena está vacía. Probemos de 4 maneras:

  • si(strlen($img_path)>0)
  • si($img_path(0))
  • si(vacío($img_path))
  • y una forma más para el final.

Y así escribiremos de la primera forma:

Función check_image_path($img_path) (if (strlen ($img_path) >0) ($img_path = "images/noimage.jpg";) return $img_path; )

Realicemos pruebas, el tiempo promedio de prueba tomó 1.43795800209 segundo.

Pensándolo un poco más... Puedes acceder al primer carácter de la línea a la vez, en lugar de a toda la línea. Si el primer carácter está ahí, entonces la cadena no está vacía. El primer carácter de la línea está numerado con "0".

Función check_image_path($img_path) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

tiempo promedio de prueba tomado 1.19431300163 seg., 17% del tiempo jugado

Intentemos escribir usando vacío() ahora:

Función check_image_path($img_path) ( if (empty ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

tiempo promedio de prueba tomado 1.1341319084 seg., 5% del tiempo reproducido del ejemplo anterior

Ahora veamos el penúltimo y último ejemplo anterior. Veamos cómo se puede combinar esto. Piensa... ¿de qué otra manera puedes optimizar?

Función check_image_path($img_path) ( if (vacío ($img_path ( 0 ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

tiempo promedio de prueba tomado 1.07465314865 seg., y nuevamente ganamos el 5% de las veces...

¿Cómo funciona y por qué es más rápido? Y aquí $img_path(0) devuelve el primer carácter... y luego la función vacío() busca una cadena vacía... la diferencia con el ejemplo anterior es que solo se pasa un carácter a la función, y no toda la cadena. Así, desde el primer ejemplo hasta el último ganamos 25% tiempo.

cadena variable (12)

Tengo una función isNotEmpty que devuelve verdadero si la cadena no está vacía y falso si la cadena está vacía. Descubrí que no funciona si paso una línea vacía.

La función no está vacía($entrada) ( $strTemp = $entrada; $strTemp = trim($strTemp); if(strTemp != "") //También probé esto "if(strlen($strTemp) > 0)" (devuelve verdadero ; ) falso retorno ;

La cadena se verifica usando isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) ( //validar el número de teléfono ) else ( echo "Número de teléfono no ingresado
"; }

Si la línea está vacía, de lo contrario no se ejecuta, no entiendo por qué, alguien puede arrojar algo de luz sobre esto, por favor.

Respuestas

si tiene un campo llamado número de serie y desea verificar si hay espacios vacíos

$número_de_serie = recortar($_POST); $q="seleccione * del producto donde user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))( if(empty($_POST["irons"]))( $irons=$row["product1"]; )

de esta manera puedes iterar a través de todos los bucles en un bucle con otra función vacía

Bueno, en lugar de responder (creo que ya has solucionado tu problema), te daré un consejo.

No sé todos los demás, pero a mí personalmente me molesta mucho cuando veo algo como:

Si(<>) (devuelve verdadero;) devuelve falso;

esto requiere un elegante "return (<>); " Mire siempre su código y elimine esta lógica. Para cada situación en la que no necesita la declaración IF.

Solo estoy escribiendo mi propia función is_string para verificar los tipos y strlen para verificar la longitud.

Función cadena vacía($cadena) ( return is_string($cadena) && strlen($cadena) === 0; ) imprimir cadena vacía("") ? "vacío" : "no vacío"; // vacío

EDITAR: También puede usar la función de recorte para verificar si una cadena no contiene.

Is_string($cadena) && strlen(trim($cadena)) === 0;

PHP tiene una función incorporada llamada vacía() La prueba se realiza escribiendo if(empty($string))(...) enlace php.net: php vacío

Tienes la respuesta, pero en tu caso puedes usar

Devuelve vacío($entrada);

Devuelve is_string($entrada);

Problema sencillo. Cambiar:

Si(strTemp!= "")

Si($strTemp!= "")

Quizás también puedas cambiarlo a:

Si($strTemp!== "")

ya que != "" devolverá verdadero si pasa el número numérico 0 y algunos otros casos debido a la conversión automática de tipos de PHP.

También tenga en cuenta que PHP ya tiene una función vacía().

PHP evalúa una cadena vacía como falsa, por lo que simplemente puedes usar:

If (trim($userinput["phoneNumber"])) ( // validar el número de teléfono ) else ( echo "Número de teléfono no ingresado
"; }

Siempre uso expresiones regulares para comprobar si hay una cadena vacía, que se remonta a los días de CGI/Perl y Javascript, así que ¿por qué no PHP, por ejemplo (aunque no esté probado)?

Devuelve preg_match("/\S/", $entrada);

Donde \S representa cualquier carácter sin espacios

Solo usa la función strlen()

If (strlen($s)) ( // no está vacío )

Hace poco me hice la misma pregunta.
Hay varias soluciones posibles, aquí tienes 3 válidas:

  • s.indexOf(inicio) === 0
  • s.substr(0,arranque.longitud) === arrancador
  • s.lastIndexOf(starter, 0) === 0 (agregado después de ver la respuesta de Mark Bayer)
  • usando un bucle:

    La función comienza con (s, iniciador) (para (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

No me he encontrado con la última solución que implica el uso de un bucle.
Sorprendentemente, esta solución es significativamente superior a las tres primeras.
Aquí está la prueba jsperf que realicé para llegar a esta conclusión: http://jsperf.com/startswith2/2

PD: ecmascript 6 (armonía) introduce su propio método startWith para cadenas.
Piense en cuánto tiempo se habría ahorrado si hubieran pensado en incluir este método tan necesario en la primera versión.

Actualizar

Tenga en cuenta que hay 2 optimizaciones de bucle que Steve incluyó, la primera de las dos mostró un mejor rendimiento, así que publicaré ese código a continuación:

La función comienza con2 (cadena, prefijo) (si (cadena.longitud< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (cadena[i] === prefijo[i]); --continúo;< 0; }




Vuelve al comienzo