Categories
PHP

Escribiendo código seguro – Comparación de Tipos

Cuando en PHP comparamos diferentes variables, pero que en cierto contexto son iguales, los tipos de datos se pierden. Por ejemplo un valor booleano verdadero es representado como 1 y el valor falso es representado como 0. Veamos lo que hace PHP con el siguiente ejemplo:

PHP:

<?php
$entero = 1;
$cadena = "1";
$booleano = true;

var_dump($entero == $cadena);
var_dump($cadena == $booleano);
var_dump($entero == $booleano);
?>
 

En los tres casos se espera "false", pero sin embargo:

CODE:

bool(true) bool(true) bool(true)
 

Otro ejemplo mucho peor:

PHP:

<?php
var_dump('1' == '1.');
?>
 
CODE:

bool(true)
 

En todos los ejemplos hemos usado un "comparador flexible" (==), este solo compara una igualdad. Esto puede traer consecuencias no deseadas en nuestra aplicación, como comenté en la entrada anterior.

La solución

Si queremos código seguro, debemos usar comparadores seguros. Para solucionar nuestro pequeño error, debemos usar un "comparador estricto" (===), este operador sólo dará verdadero si dos variables son idénticas.

PHP:

<?php
$entero = 1;
$cadena = "1";
$booleano = true;

var_dump($entero === $cadena);
var_dump($cadena === $booleano);
var_dump($entero === $booleano);
?>
 

Ahora si la salida será correcta:

CODE:

bool(false) bool(false) bool(false)
 

Una pequeña reflexión: "Así vemos que por medios pequeños, podemos hacer grandes cosas"

Referencias

13 replies on “Escribiendo código seguro – Comparación de Tipos”

Tienes razón, sería mucho más sencillo, pero estos lenguajes tampoco son la panacea para todo, existen ocasiones en las que necesitas la flexibilidad de un lenguaje dinámicamente tipado.

Concuerdo con todos los comentarios, el mundo real(TM) es así 🙂

Creo que PHP es el lenguaje más popular porque definitivamente es el más fácil de aprender (sin tener ninguna experiencia de programación)

existen ocasiones en las que necesitas la flexibilidad de un lenguaje dinámicamente tipado

Sí, las ocasiones en las que necesitas hacer un software de muy pequeña magnitud y a una velocidad muy rápida. Pero, ¿cuándo ocurre que un software de este tipo no necesita mejoras y no acaba convirtiéndose en más grande a medida que pasa el tiempo? Lo que provoca que por la mala decisión inicial el software se convierta en un código spaghetti insufrible.

En mi opinión los lenguajes dinámicamente tipados los deberían usar solamente los administradores de sistemas para ayudarles en su tarea de creación de scripts, no los desarrolladores de ningún tipo.

pero lamentáblemente PHP es uno de los lenguajes mas populares de estos tiempos

Cierto. Cien mil billones de moscas no pueden estar equivocadas: la mierda está rica.

es más fácil de aprender que C# por ejemplo

Muy bien, reduzcamos la calidad de nuestro trabajo en pro de la pereza y la vaguería. (De todas formas, yo creo que la complejidad superior hipotética de C# con respecto a PHP está solamente relacionada con el número de librerías con las que uno tiene que lidiar, porque el lenguaje es meramente sintaxis).

intento al menos solventar esos problemas con estos pequeños ejemplos.

¿No querías algo fácil de aprender? Pues ahora pagas las consecuencias. Estos ejemplos ya no son "fáciles" así que si ahora te aventuras con cosas más complejas, ¿por qué no aprendes herramientas más complejas que te enseñarán a que no es necesario hacer cosas complejas para resolver cosas complejas si la herramienta es lo suficientemente potente?

(sin tener ninguna experiencia de programación)

Me recordáis a los aprendices de VB(asura).

PD: ¿Para cuándo vista previa en este blog?

Ympostor:

Permiteme sugerirte la lectura del paper "Static Typing Where Possible, Dynamic Typing When Needed" publicado por Erick Meijer y Peter Drayton, este documento es parte de los esfuerzos de MS por dotar de características "dinámicas" a futuras versiones de C# o VB.net (que ya están presentes a través de extensiones de lenguaje, como LINQ).

Por el lado de java, te sugiero que le des un vistazo al primer video que aparece en la siguiente página: http://www.langnetsymposium.com/speakers.asp

Es acojonante, parece que hubieras querido escribir un comentario con una postura diferente a la mía, pero sin embargo me has dado la razón.

¿Por qué? Porque el título del primer artículo al que me haces referencia lo dice: "static typing where possible", es decir, que siempre que sea posible, deberíamos ceñirnos al tipado estático; y cuando no es posible, al dinámico. Y C# puede suplir ambas necesidades: es un lenguaje de tipado estático, con capacidades de dinamicidad gracias a la API de reflection de la librería de clases. De hecho yo muchas veces he tenido que usar la dinamicidad de tipos con C# a modo de excepción.

Lo que considero que es un error es directamente empezar a programar con un lenguaje dinámicamente tipado: ya no vas a poder optar nunca más por el tipado estático. Sin embargo si optas por uno estático siempre podrás volver atrás en un momento concreto del desarrollo, y sin cambiar de lenguaje.

Otra cosa que me sorprende es que me cites LINQ, pues es precisamente una tecnología para eliminar la dinamicidad en el acceso a datos, pues las consultas SQL con esta tecnología pasarán a estar compiladas pues pertenecerán al propio lenguaje, y por tanto serán más estáticamente tipadas.

La reseña que me has hecho al vídeo de la charla sobre lenguajes dinámicamente tipados en la plataforma Java no la cojo ningún sentido. ¿Quiere decir esto que Java es peor que un lenguaje dinámicamente tipado? No, lo que quiere decir es que los que apuestan por los lenguajes dinámicamente tipados no sólo se encuentran en el mundo PHP/Perl/Python, sino también en el mundo Java y en el mundo .NET (IronPython, JScript.NET, etc.).

Si revisas el primer comentario que hice, en ningún momento he dicho que un lenguaje dinámicamente tipado sea mejor que uno estáticamente tipado, así que el segundo comentario era más para "aclarar" mi postura al respecto. (me daba la ligera impresión de que de algún modo despreciaras a los lenguajes dinámicamente tipados)

El paper que cité era para mostrar que lo _ideal_ es juntar lo mejor estas dos posturas y que justamente en las siguientes versiones de lenguajes como C# y Java intentan agregar caracteríticas de los "lenguajes dinámicos".

En cuanto a LINQ no sé a qué te refieres con "eliminar la dinamicidad en el acceso a datos", pero lo que quería indicar es que esta "tecnología" se basa en cierta forma, en características dinámicas que ofrecen estas extensiones de lenguaje.

Y ....una pregunta
.......existe el operador "Estrictamente Diferente de "???
o solo se puede usar el "Diferente de "???

"Estrictamente Diferente de " "!=="
"Diferente de " "!="

php:

  var_dump( '1' != '1.' );
 

Carlos Sosa
Uruguay

[PHP] Comparacion flexible, comparación estricta...

Para aquellos casos en que 1 no deba ser interpretado igual que "1", existe el operador ===. Espero que os sea de utilidad (Vía programame.net)...

Leyendo los comentario me parece que se olvida algo que yo creo fundamental.

Cada lenguaje tiene sus ventajas he inconvenientes, no creo que exista un lenguaje de uso general que sea optimo en todas las situaciones por lo que pienso que lo mas importante es saber escoger el lenguaje con el que se va a afrontar un problema y no perderse en discusiones, de mucho fondo y pocos resultados practicos, sobre que lenguaje seria mejor o peor en todos los casos.

Por mi parte creo que todos los comentarios anteriores tienen su parte de razon pero que ninguno es definitivo para decantarse por un lenguaje como herramienta de uso general.

Saludos 🙂 .

Opino igual que arrase.
Además, parece que el que "ama" C# y que tanto defiende a los lenguajes estáticamente tipados, tiene (como ya han comentado) un odio especial a ese tipo de lenguajes, los dinámicamente tipados.

¿Está C# orientado al desarrollo web? No. Puedes hacer servicios web y cosas así, pero NO es un lenguaje creado para desarrollar páginas web. Necesitas "esa cosa" llamada ASP.NET. Si, yo tengo especial odio a esa tecnología.
¿Está PHP orientado al desarrollo web? Mejor dicho, PHP se creó para desarrollar páginas web.

Aparte de eso, el que un lenguaje sea más fácil de aprender que otro no es porque sea peor. En mi opinión, PHP es lo mejor para desarrollo web.

Como han dicho, escoge un lenguaje en función del desarrollo que tengas que llevar a cabo, no porque te guste más o menos.

Si tengo que hacer una web, utilizo PHP, Javascript, Ruby...
Si tengo que hacer una aplicación de escritorio, utilizo Java, C#, Visual Basic...

A cada cosa lo suyo, otra cosa es que puedan entrar tímidamente en otros campos y puedas usarlos para otras cosas.
Y por supuesto, otra cosa es que estén estática o dinámicamente tipados.

C# es un lenguaje estáticamente tipado, pero como han dicho, puedes hacerlo también dinámicamente.

PHP es un lenguaje dinámicamente tipado, pero como muestran en el ejemplo del artículo, puedes utilizar comparaciones como si se tratara de un lenguaje estáticamente tipado.

¿cuál es el problema?

Comments are closed.