(Cuándo) debo usar sugerencias de tipos en PHP?


No puedo entender la motivación de los autores de PHP para agregar el tipo de insinuación. Viví felizmente antes de que apareciera. Luego, como se agregó a PHP 5, comencé a especificar tipos en todas partes. Ahora creo que es una mala idea, en cuanto a duck typing asegura un acoplamiento mínimo entre las clases, y aprovecha la modularización y reutilización de código.

Parece que las sugerencias de tipo dividen el idioma en 2 dialectos: algunas personas escriben el código en estilo de lenguaje estático, con las sugerencias, y otros se adhieren a el viejo modelo de lenguaje dinámico. ¿O no es una situación de "todo o nada"? ¿Debo de alguna manera mezclar esos dos estilos, cuando sea apropiado?

Author: Ivan Krechetov, 2009-02-11

6 answers

No se trata de tipeo estático vs dinámico, php sigue siendo dinámico. Se trata de contratos para interfaces. Si sabe que una función requiere un array como uno de sus parámetros, fuerce el array allí mismo en la definición de la función. Prefiero fallar rápido, en lugar de errar más tarde en la función.

(También tenga en cuenta que no puede especificar sugerencias de tipo para bool, int, string, float, lo que tiene sentido en un contexto dinámico.)

 35
Author: Mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 13:23:15

Debe usar sugerencias de tipo siempre que el código de su función definitivamente se base en el tipo del parámetro pasado. El código generaría un error de todos modos, pero la sugerencia de tipo le dará un mejor mensaje de error.

 15
Author: soulmerge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 12:40:49

La motivación del grupo PHP para agregar sugerencias de tipos era proporcionar a las personas acostumbradas al OOP al estilo Java otra característica que haría que la plataforma fuera más familiar, cómoda y atractiva. Esto, a su vez, haría PHP más "listo para la empresa", lo que ayudaría a Zend con su negocio principal.

Comercialización aparte, tiene sus usos. Si está escribiendo un método que opera en un parámetro de una manera específica que causaría errores involuntarios (a menudo silenciosos) si el parámetro fue otra cosa, entonces el uso de sugerencias de tipo asegura que el código se rompa durante el desarrollo en lugar de romper en la producción.

 10
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 16:46:50

Si alguna vez decide hacer sugerencias de tipo, al menos hágalo utilizando interfaces en lugar de clases concretas o abstractas. La razón es simple, PHP no permite la herencia múltiple pero sí permite implementar múltiples interfaces. Así que si alguien intenta usar su biblioteca no tendrá dificultades para implementar su interfaz en lugar del caso en el que tendría que extender su clase abstracta/concreta dado que ya extiende otra ya.

 5
Author: Ionuț G. Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 15:38:48

Sin la indicación de tipo sería imposible para el IDE conocer el tipo de un parámetro de método y por lo tanto proporcionar el intellisense adecuado - su editor tiene intellisense, ¿verdad? ;). Debe decirse que solo asumo que los IDEs usan esto para intellisense, ya que es la primera vez que he oído hablar de insinuaciones de tipos en PHP (gracias por la sugerencia, por cierto).

 0
Author: Morten Christiansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-11 13:48:34

La insinuación de tipos es un punto de debate en nuestra empresa (principalmente a la gente de Java le gusta), y soy un programador PHP de la vieja escuela (y programa en otros idiomas).

Mi consejo es evitar la insinuación de tipos e incluir controladores try/catch en cada función compleja.

La sugerencia de tipo obliga a una aplicación a confiar en el entorno de manejo de excepciones de llamantes, que en general es malo y no se prueba, el problema principal. Para las aplicaciones web, esto resulta en la pantalla blanca de la muerte, para lote que resulta en simplemente una salida fatal sin registrar buenos mensajes en la mayoría de los casos, y usted sentado su rascándose la cabeza tratando de recrear el usuario o problema de la aplicación que la administración está en su espalda para resolver.

El manejo local de excepciones proporciona un escenario de pruebas más controlado que incluye basura en los tipos de datos y basura en los valores de datos, lo que proporciona un conjunto de pruebas mucho más completo en comparación con una ruta de manejo de excepciones difícil de probar en la persona que llama al pasar un tipo incorrecto y esperando la excepción.

La prueba de excepción también falla en muchos casos debido a problemas de versión de pila (es decir, algunas versiones de PHP como 5.4 no detectan errores "fatales" de una manera adecuada y ergo phpunit simplemente muere rompiendo suites de prueba. Este es un problema específico de la pila, sin embargo, en mi experiencia, la insinuación de tipos simplemente es innecesaria, hace que las personas que están acostumbradas a un lenguaje escrito acepten PHP mejor sin darse cuenta del impacto, y causa mucho más escenarios de prueba complejos (muy difícil probar los llamantes que manejan los resultados de la ruta de excepción).

La gente de Java y otros tipos de lenguaje no están aceptando o entendiendo cómo aprovechar y beneficiarse de los parámetros de tipo mixto predeterminados en PHP... Aprenderán algún día, pero solo si adoptan la forma de PHP. ;-)

Las mejores lecciones se aprenden al desarrollar escenarios de prueba basados en unidades PHP robustos, y eso normalmente arrojará luz sobre por qué la insinuación de tipos es un dolor en el trasero relacionado con las pruebas, y causa mucho más problema que bueno... A cada uno lo suyo, y mis aplicaciones funcionan mejor y de manera más confiable y las pruebas resultan mucho más completas con una cobertura de código generalmente del 100%, incluidas las rutas de captura en las funciones locales.

 -1
Author: Doug Doug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 13:31:17