Pregunta

PHP, como todos sabemos, está muy poco escrito. El idioma no requiere que especifique ningún tipo de tipo para parámetros de función o variables de clase. Esta puede ser una característica poderosa.

Sin embargo, a veces, puede hacer que la depuración de su script sea una experiencia dolorosa. Por ejemplo, pasar un tipo de objeto a un método que espera que un tipo diferente de objeto puede producir mensajes de error quejándose de que no existe una determinada variable / método para el objeto pasado. Estas situaciones son en su mayoría molestias. Los problemas más onerosos se dan cuando inicializa un objeto con un objeto de la clase incorrecta y ese " objeto incorrecto " No se utilizará hasta más adelante en la ejecución del script. En este caso, obtendrá un error mucho más tarde que cuando aprobó el argumento original.

En lugar de quejarme de que lo que pasé no tiene un método o variable específicos, o esperar hasta mucho más tarde en la ejecución del script para que se use mi objeto pasado, preferiría tener un error mensaje, exactamente donde especifico un objeto del tipo incorrecto, quejándome de que el tipo del objeto es incorrecto o incompatible.

¿Cómo maneja estas situaciones en su código? ¿Cómo detectas tipos incompatibles? ¿Cómo puedo introducir una comprobación de tipos en mis scripts para poder obtener mensajes de error más fáciles de entender?

Además, ¿cómo puedes hacer todo esto mientras cuentas la herencia en Php? Considera:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

Luego, un usuario de este código implementa la interfaz con su propia clase concreta:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Quiero que las instancias de ConcreteClass, y todos los futuros objetos desconocidos definidos por el usuario, también sean aceptables para SetObject. ¿Cómo haría esto permisible en la comprobación del tipo correcto?

¿Fue útil?

Solución

En realidad, para las clases, puede proporcionar sugerencias de tipo en PHP (5+).

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

Esto también funcionará correctamente con la herencia como esperaría.

Además, no ponga la palabra 'objeto' en sus nombres de clase ...

Otros consejos

como una adición a la respuesta de Eran Galperin, también puede utilizar la sugerencia de tipo para forzar que los parámetros sean matrices, no solo objetos de una determinada clase.

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

Como puede ver, puede escribir una sugerencia de que el método :: passMeAnArray () espera un array , así como proporcionar un valor predeterminado en caso de que el método se llame w / o cualquier parámetro.

Para los tipos primitivos también puede usar las funciones is_ *:

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

Verá, hay varias respuestas sobre sugerencias de tipo. Esta es la solución técnica. Pero también debe asegurarse de que todo el diseño sea sensato e intuitivo. Esto hará que los problemas de tipo y los errores sean más raros.

Recuerde que incluso estos errores de tipo se lanzarán en tiempo de ejecución . Asegúrese de tener pruebas para el código.

Incluso en el caso que describe, su secuencia de comandos se bloqueará y se quejará de que no hay ningún método / atributo X en el objeto Y, por lo que sabrá de dónde proviene esto.

De todos modos, creo que siempre intentar evitar que los programadores crecidos pasen el objeto equivocado a un método no es una buena inversión de tiempo: podría dedicarlo a documentar y entrenar.

Lo que necesita es

escribir pato y ser cuidadoso con sus colegas, no verificaciones adicionales que lo harán más rígido en su aplicación.

Pero puede ser un punto de vista pitonista ...

@ Eran Galperin La respuesta es el método preferido para garantizar que el objeto que está utilizando sea del tipo correcto.

También vale la pena mencionar el operador instanceOf : es útil para cuando desea comprobar que objeto es uno de varios tipos.

Puede establecer la configuración ini de informe de errores en su archivo php.ini o usar la función de informe de errores para establecerla en tiempo de ejecución

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top