¿Es posible escribir código PHP estrictamente tipado?

Por ejemplo, ¿es posible escribir código como este?

int $x = 6; str $y = "hello world"; bool $z = false; MyObject $foo = new MyObject(); 

Y es posible definir funciones como esta:

 public int function getBalance() { return 555; //Or any numeric value } 

Editar: esta respuesta se aplica a las versiones de PHP 5.6 y anteriores. Como se señaló en las respuestas recientes, PHP versión 7.0 y posterior tiene algo de apoyo para esto


Respuesta original:

No. Hay soporte para sugerencias de tipos desde php5, pero “Type Hints solo puede ser del tipo de objeto y matriz (desde PHP 5.1). No se admite la sugerencia de tipos tradicionales con int y string”.

Eso es todo lo que php va actualmente, y hasta donde debería ir si me preguntas.

En PHP 7 se implementan “Declaraciones de tipo escalar”, por ejemplo:

 public function getBalance(): int { return 555; } 

Debes declarar que usarás tipos estrictos:

  

Más información: https://wiki.php.net/rfc/scalar_type_hints_v5

PHP no está estrictamente tipado, entonces no. Dicho esto, admite sugerencias de tipo limitado sobre funciones, eso es lo más cercano posible.

¡Lamentablemente no! Ahora estoy al final de un gran proyecto que involucra muchos algoritmos (teoría de grafos, circuitos, etc.) y desearía no haber elegido php.

He estado usando php durante aproximadamente 10 años, y todavía creo que es un buen lenguaje, ¡sin embargo, uno tiene que decidir! Lo que es malo para mí, la falta de tipeo estricto podría ser bueno para otra persona.

Además, quiero mencionar que a menudo escribí código adicional para soportar el tipado estricto, solo un ejemplo claro es este:

 if (is_array($r) && count($r)===0) 

y los errores y situaciones ocultas, etc. que fueron revelados están más allá de la explicación.

Hubo errores y situaciones que nunca pude pensar / detectar apriori, escribir todos estos códigos extra no me gustaba, pero al menos me salvarán de errores tontos.

Si quisiera volver, tal vez elegiría php para el elemento web, usted sabe cómo obtener y mostrar datos al usuario, php es genial para eso, maneja cadena, arreglos, habla con la base de datos, etc., pero para el núcleo principal , algoritmos, etc. Me gustaría ir a C ++, tal vez haskell … no sé, al menos algo estrictamente tipeado.

Algo que puede intentar para simular la verificación de tipo estricta de un hombre pobre es usar assert () para forzar el resultado de un tipo particular antes de devolverlo:

 /** * Get Balance * * @return int */ function getBalance() { /* blah blah blah */ $out = 555; //Or any numeric value assert('is_int($out)'); return $out; } 

De modo que mantiene sus aserciones activas durante todo el desarrollo y las pruebas, como las comprobaciones que hace el comstackdor en tiempo de comstackción.

Por supuesto, la página assert (assert) desea afirmar que no se deben usar las aserciones para verificar los parámetros de entrada, sino más bien usar condicionales normales para verificarlos.

Esta respuesta tenía lo que yo pensaba que era una buena regla:

La regla de oro que se aplica en la mayoría de los idiomas (todo lo que conozco vagamente) es que una afirmación se usa para afirmar que una condición es siempre cierta, mientras que una si es apropiada si es concebible que a veces fallará.

Si está simulando una verificación de tipo estricta (escribiendo su código para mantener los tipos de manera maliciosa, no tratando de validar la entrada desde el exterior), entonces debe estar seguro de qué tipo es, a menos que haya cometido un error.

Actualizar:

También está esto: http://hacklang.org/ El lenguaje basado en PHP de Facebook con tipeo estático.

Tal vez deberías probar esta extensión PHP https://github.com/krakjoe/strict . Se presenta soporte para los siguientes tipos:

  • cuerda
  • entero, int
  • flotar, doble
  • booleano, bool
  • recurso

No. Esa syntax no funcionará.

Podrías, teóricamente, idear un sistema de objetos que impusiera su propio tipo de tipificación estricta, pero no funcionaría y … ¿por qué querrías hacerlo?

Si necesita escribir estrictamente, use un lenguaje estrictamente tipado.

Dado que la respuesta es básicamente “no”, una alternativa: un “linter” de PHP, que debería capturar algunas de las cosas que una verificación en tiempo de comstackción captaría en un lenguaje de tipo estático como C. No es lo mismo, pero debería evitar algunas tonterías

“¿Hay un analizador de código estático [como Lint] para archivos PHP?” Enumera muchos de estos.

Puede usar el transpiler h2tp para transstackr el código HACK en PHP:

Puede hacerlo gracias al Equipo de Facebook y HACK Language .

Visite http://hacklang.org y http://hhvm.com para obtener más información.

Si desea codificar directamente en el entorno Hack + HHVM, también puede usar el IDE Nuclide interno de Facebook