¿Es posible escribir código PHP estrictamente escrito?

7 minutos de lectura

avatar de usuario
Ali

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
}

  • Me acabo de dar cuenta que ambos tenemos 89 años :O

    – code_burgar

    2 de octubre de 2009 a las 23:39

  • Nunca fui un desarrollador de php, pero esto ayuda: infoworld.com/article/2610885/… ?

    – nawfal

    29 mayo 2015 a las 18:15

  • PHP 7 ahora se escribe ESTRICTAMENTE (no se escribe FUERTEMENTE).

    – Ryan Nerd

    31 de mayo de 2016 a las 15:19

  • PHP nunca (me atrevo a decir) se convertirá en un lenguaje fuertemente tipado, pero sí creo que en un futuro cercano se convertirá en un lenguaje gradualmente tipeado (como TypeScript).cstruter.com/blog/410

    – cstruter

    29 de junio de 2016 a las 14:47


  • Los lenguajes fuertemente tipados como C# te obligan a declarar un tipo para CUALQUIER variable que crees (por ejemplo, int my_integer, string my_string, object my_object). Los lenguajes estrictamente tipificados, como PHP, imponen tipos de datos cuando se activan, como a través de declare (strict_types=1). También en PHP 7, la tipificación estricta solo existe en los parámetros de su función como sugerencias de tipo. En otras palabras, PHP 7 no admite esta declaración: string $myString = “string”; Hubo un RFC para agregar declaraciones de tipo a las propiedades en una clase, pero lamentablemente fue derribado: wiki.php.net/rfc/typed-properties

    – Ryan Nerd

    5 de julio de 2017 a las 19:10


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

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

Debe declarar que utilizará tipos estrictos:

<?php
    declare(strict_types=1);

    function sum(int $a, int $b): int {
        return $a + $b;
    }

    sum(1, 2);
?>

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

  • PHP7 aún le da cero errores/advertencias sobre algo tan extraño como echo ('I want ' . ('$100' + 'dollars') . '!'); Hará eco “¡Quiero 0!”. Entonces, 1) no escriba software de contabilidad y sistemas críticos en PHP si puede evitarlo, 2) No espere que el sistema de tipos de PHP esté a la altura de Java, o incluso de Python, que lanza excepciones en cosas como concatenar no cadenas. .

    – Sin errores

    17 de agosto de 2015 a las 5:18


  • Hay una diferencia entre escribir FUERTEMENTE y ESTRICTAMENTE como señaló @NoBugs. PHP se está moviendo en la dirección de convertirse en un lenguaje fuertemente tipado, pero aún no ha llegado a ese punto.

    – Ryan Nerd

    31 de mayo de 2016 a las 15:17


  • @NoBugs: Ese código provoca una advertencia en PHP 7.1: wiki.php.net/rfc/invalid_strings_in_arithmetic

    – Janus Troelsen

    22 de agosto de 2016 a las 11:20

  • No entiendo por qué el equipo central decidió implementarlo de esta manera, pero es importante tener en cuenta que la declaración de modo estricto define el de la persona que llama preferencia, y es por archivo. Es decir, cualquier función/método llamadas realizadas dentro del archivo respetan la configuración estricta de ese archivo, incluidas las llamadas dentro del archivo que hacen referencia a métodos/funciones declarados fuera del archivo. No se aplica a las funciones declaradas dentro del archivo (excepto cuando esas funciones se llaman desde el mismo archivo en el que están declaradas).

    – Aarón

    15/09/2017 a las 20:05


  • También tenga en cuenta que cuando se llama a una función en modo débil (no estricto) y un argumento no coincide con la declaración de tipo, el valor del argumento será coaccionado al tipo declarado sin previo aviso. Como implementador, no tiene control sobre este comportamiento y, si realmente desea aplicar una tipificación estricta para una función en todos los casos, debe eliminar las declaraciones de tipo y verificar los tipos en la definición de la función de forma manual.

    – Aarón

    15/09/2017 a las 20:30


avatar de usuario
codigo_burgar

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 posteriores tienen cierto soporte para esto


Respuesta original:

No. Solo hay soporte para tipo insinuación desde php5, pero “Las sugerencias de tipo solo pueden ser del tipo objeto y matriz (desde PHP 5.1). Las sugerencias de tipo tradicionales con int y cadena no son compatibles”.

En PHP 7 se implementan “Declaraciones de tipo escalar”, consulte la respuesta a continuación.

Hasta ahí llega php actualmente, y hasta donde debería llegar si me preguntas.

  • En PHP 7 puede especificar otros tipos. Ver php.net/manual/es/…

    – Barmar

    23 de enero de 2017 a las 1:08

  • No, esta respuesta está desactualizada. PHP 7 no permite esto. Solo es posible declarar tipos en parámetros de función.

    – bóctulo

    18/01/2019 a las 21:20

PHP no está estrictamente escrito, así que no. Dicho esto, es compatible con limitado tipo insinuación en funciones – eso es lo más cerca que se pone.

avatar de usuario
Melsi

¡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 tipificación estricta podría ser bueno para otra persona.

Además, quiero mencionar que a menudo escribía código adicional para admitir la tipificación estricta, solo un ejemplo simple 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 toda explicación.

Hubo errores y situaciones que nunca hubiera podido pensar/detectar a priori, escribir todo este código extra no estaba disfrutando, ¡pero al menos me salvará de errores tontos!

Si volviera, tal vez elegiría php para el elemento web, ya sabes, obtener y mostrar datos al usuario, php es excelente para eso, manejar cadenas, matrices, hablar con la base de datos, etc., pero para el núcleo principal , algoritmos, etc. Iría por C++, tal vez haskell… no sé, al menos algo estrictamente escrito.

avatar de usuario
Calpau

Algo que podría intentar para simular la verificación estricta de tipos de un hombre pobre es usar afirmar () para forzar que la salida sea de un tipo particular antes de devolverla:

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

Por lo tanto, mantiene sus afirmaciones activas durante todo el desarrollo y las pruebas, algo así como las comprobaciones que realiza el compilador en tiempo de compilación.

Concedido, el afirmar() page desea afirmar que no debe usar aserciones para verificar los parámetros de entrada, sino usar condicionales normales para verificarlos.

Esta respuesta tenía lo que pensé que era una buena regla:

La regla general que se aplica en la mayoría de los idiomas (todo lo que sé vagamente) es que se usa una afirmación para afirmar que una condición siempre es verdadera, mientras que un if es apropiado si es concebible que a veces falle.

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

Actualizar:

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

avatar de usuario
marcio

Quizás deberías probar esta extensión de PHP https://github.com/krakjoe/strict. Se introduce soporte para los siguientes tipos:

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

avatar de usuario
javierfuentes

podrías usar h2tp transpilador para transpilar código HACK a PHP:

Puedes hacerlo gracias al equipo de Facebook y Idioma HACK.

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

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

¿Ha sido útil esta solución?