Categories
PHP

PHP Fail

Aparentemente un "string" no es un "string" en PHP.

php:

<?php
interface IPhpSucks {
        function foo(string $bar);
}
class PhpSucks implements IPhpSucks {
    function foo(string $bar) {}
}
$f = new PhpSucks();
$f->foo('demo');

Al ejecutar ese script, se obtiene un lindo error.

Catchable fatal error: Argument 1 passed to PhpSucks::foo() must be an instance of string, string given, called in demo.php on line 10 and defined in demo.php on line 6

Actualización: Averiguando un poco más, al parecer esta característica (Type Hinting) funciona sólo para nombres de clases o el tipo array (s/PhpSucks/ISuckInPhp/).

5 replies on “PHP Fail”

buenas, creo que antes de "criticar" un lenguaje debemos acudir a su documentación oficial. Normalmente este tipo de detalles los ven programadores que trabajaban con java (la comparación entre lenguajes siempre va a existir :)) y están acostumbrados a colocar el tipo de dato. Hay que entender que php por defecto toma los tipo de datos sin necesidad de declarar la variable por el valor que se este asignando a esta, aunque muchos quieran con el tyoe hintig indicar el tipo de datos y en php como bien muestras en tu actualización este se usa solo para nombre de clases y el tipo array (documentado oficialmente), por lo que no seria un error.

Si lo que deseas es validar tipo de datos hay funciones para realizar esto, saludos

Carlos, probablemente no se nota en la actualización de la entrada, pero asumí que esa característica funcionaba también para los tipos primitivos. Conozco relativamente bien la inferencia de tipos y he tenido también la oportunidad de implementarlo para un lenguaje de programación que no viene al caso mencionarlo.

Los tipos permiten asegurar ciertas propiedades sobre los programas. En muchos casos, imagino que el intérprete de PHP tambien lo hace, sirve para optimizar ciertas instrucciones.

El "problema" es que PHP usa un sistema de tipos dinámico, esto hace que las garantías que tienes sean un poco más débiles, comparándolo con algún lenguaje con sistema de tipos estático (esto no necesariamente significa que haya anotaciones de tipo). Dejarle calcular los tipos al intérprete funciona, pero eso puede causar problemas al recibir un tipo que no se esperaba.

php:

function foo($foo){$foo->foo();}

En el ejemplo, se podría pasar cualquier instancia de una clase que tenga un método "foo". Probablemente pueda que sea útil en algunos casos, pero en la mayoría sólo se usarán instancias del mismo tipo. Es cierto también que existen funciones para verificar los tipos, pero si tienes posibilidad de sugerir el tipo al intérprete, eso es más elegante y seguramente sea más rápido en términos de rendimiento que usar una función.

Concuerdo un poco en que asignarle el tipo que deseamos de parámetro a los métodos seria excelente, pero como bien dijiste las variables en php generan el tipo dinámico, genera debilidad??? depende del programador, en mi caso mis sistemas no permiten que haya un dato que yo no quiera que haya y si por casualidad un usuario por medio de los input, url, curl o cualquier forma que haya de enviar datos a un sistema, lanzo y capturo la excepción de manera que exista seguridad en el sistema, por eso te indico que todo depende del programador, siendote sincero en mi paso por C y C++ algo que me molestaba era tener que declarar arrays ya que había que indicar el tamaño del mismo, cosa que en php por generarse dinamicamente es una pasada, personalmente reconozco que hay muchas cosas de otros lenguajes que me gustaria que implementara PHP, pero el generar datos dinamicamente creo que me gusta mas la forma de php, claro es una opinión personal, saludos

Carlos, cuando digo debilidad es que los sistemas de tipos dinámicos inherentemente no te aseguran al 100% si un programa está correctamente tipado o no.

Ignoro que tan grande sean tus sistemas, pero a medida que éstos se hacen más complejos, es más complicado de decir si no tienen este tipo de errores. Confiar en que tan bueno o malo sea un programador, no es aceptable en muchos casos. Por cierto, es justamente por ésta razón que existe bastante trabajo de investigación en el área de vérificación de software, para proveer métodos y utilidades que permitan determinar si los programas cumplen ciertas propiedades o especificaciones.

Ten en cuenta que sólo he estado hablando de sistemas de tipos en estos últimos dos comentarios.

Comments are closed.