2009-10-02 18 views
21

Por ejemplo, es posible escribir código como este:¿Es posible escribir código PHP estrictamente tipado?

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

Y es posible definir las funciones de la siguiente manera:

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

me he dado cuenta de que los dos somos 89 años de edad: O –

+0

nunca fue un desarrollador de PHP, pero hace esto ayuda: http: //www.infoworld.com/article/2610885/facebook-q-a - hack-trae-static-typing-to-php-world.html? – nawfal

+0

PHP 7 ahora está ESTRICTAMENTE tipeado (no fuertemente tipado). – RyanNerd

Respuesta

16

Editar: Esta respuesta se aplica a las versiones de PHP 5.6 y anteriores. Como se observa en las respuestas recientes, la versión de PHP 7.0 y posterior tiene un poco de apoyo a esta


Respuesta original:

No. Hay apoyo para el tipo insinuando desde PHP5, pero "Sugerencias tipo sólo pueden ser de el tipo de objeto y matriz (desde PHP 5.1). No se admite la sugerencia de tipo tradicional con int y cadena. "

Eso es tan lejos como php actualmente va, y hasta donde debería ir si me preguntas.

+0

En PHP 7 puede especificar otros tipos. Consulte http://php.net/ manual/es/functions.arguments.php # functions.arguments.type-declaration – Barmar

1

No. Eso sintaxis no funcionará.

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

Si necesita escribir estrictamente, use un lenguaje estrictamente tipado.

+0

Me encantaría usar un lenguaje estrictamente tipado pero mis clientes solo quieren usar php :( –

+1

Agradecer a sus clientes ... o maldecirlos ... como sea el caso puede ser – pavium

+3

Si un lenguaje estrictamente tipado es realmente la única herramienta correcta para el trabajo, puede considerar la posibilidad de retroceder. Si contrató a un carpintero, no le diría que use solo un destornillador. –

9

PHP no está estrictamente tipado, entonces no. Dicho esto, admite funciones de type hinting limitadas, eso es lo más cercano posible.

1

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 compilación captaría en un lenguaje de tipo estático como C. No es lo mismo, pero debería evitar algunas tonterías

"Is there a static code analyzer [like Lint] for PHP files" enumera muchos de estos.

4

Desafortunadamente 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, hay 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ía código extra para soportar tipos de datos estrictos, sólo un ejemplo sencillo es la siguiente:

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 todo este código extra no me gustaba, pero al menos me salvará de errores estúpidos.

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, manejar cadena, arreglos, hablar 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.

+2

Evitaría usar la palabra clave 'and', ya que puede ocasionar problemas imprevistos. Consulte http://stackoverflow.com/questions/2803321/and-vs-as-operator # answer-2803576 – Tyzoid

+0

@Tyzoid No puedo agradecerte lo suficiente por esto, programo en php durante años y nunca escuché acerca de eso. Estoy editando mi respuesta ahora. – Melsi

+0

No hay problema :) Todavía aprendo cosas sobre php después de cinco años. – Tyzoid

2

algo que podría tratar con el fin de simular la estricta comprobación de tipos de un hombre pobre está utilizando valer() para forzar la salida sea 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; 
} 

por lo que mantener sus afirmaciones activo durante todo el desarrollo y las pruebas, algo así como las comprobaciones que hace el compilador en tiempo de compilación.

Concedido, la página assert() desea afirmar que no debe usar las aserciones para verificar los parámetros de entrada, sino que debe usar condicionales normales para verificarlos.

This answer tenía lo que yo pensaba que era una buena regla:

La regla de oro que es aplicable en la mayoría de los idiomas (todos los que vagamente sé) es que una aserción se utiliza para afirmar que una condición es siempre cierto, mientras que un if es apropiado si es concebible que a veces fallará.

Si usted está simulando estricta verificación de tipos (escribir el código para mantener brutalmente tipos; no tratando de validar la entrada desde el exterior), entonces usted debe estar seguro de lo que es el tipo a menos que haya tomado una Error.

Actualización:

También hay esto: http://hacklang.org/ lenguaje basado en PHP de Facebook con tipos estáticos.

2

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

  • cadena
  • número entero, int
  • float, double
  • boolean, bool
  • recurso
+3

El soporte solo se introduce para tipos de parámetros, y finalmente devuelve tipos (cuando el parche se fusiona en PHP7). Las variables escritas no son posibles a través de una extensión. –

41

En PHP 7 se implementan "Scalar Escriba las declaraciones ", p. Ej .:

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

tiene que declarar, que va a utilizar estrictas tipos:

<?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

+4

PHP7 todavía le da cero errores/advertencias en algo tan extraño como 'echo ('I want'. ('$ 100' + 'dollars'). '!');' Se repetirá "I want 0!". Entonces, 1) no escriba software de contabilidad y sistemas críticos en PHP si puede ayudarlo, 2) No espere que el sistema de tipos de PHP esté a la par con Java, o incluso Python, que arroja excepciones sobre cosas como concatenar cadenas. . – NoBugs

+0

Hay una diferencia entre FUERTEMENTE tipeado y ESTRICTAMENTE tipeado como @NoBugs señalado. PHP se está moviendo en la dirección de convertirse en un lenguaje fuertemente tipado, pero todavía no está allí. – RyanNerd

+0

https://en.wikipedia.org/wiki/Gradual_typing – eis

0

usted podría utilizar h2tp transpiler a transpile código de truco para PHP:

Usted puede hacer esto gracias al equipo de Facebook y HACK Language.

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

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

Cuestiones relacionadas