Question

PHP, comme nous le savons tous, est très typé. Le langage ne vous oblige pas à spécifier un type de type pour les paramètres de fonction ou les variables de classe. Cela peut être une fonctionnalité puissante.

Cependant, il peut arriver que le débogage de votre script devienne une expérience pénible. Par exemple, le fait de passer un type d'objet dans une méthode qui attend un type d'objet différent peut générer des messages d'erreur indiquant qu'une certaine variable / méthode n'existe pas pour l'objet transmis. Ces situations sont principalement des ennuis. Des problèmes plus lourds se posent lorsque vous initialisez un objet avec un objet de la mauvaise classe et que "mauvais objet" ne sera utilisé que plus tard dans l'exécution du script. Dans ce cas, vous obtenez une erreur beaucoup plus tard que lorsque vous avez passé l'argument d'origine.

Au lieu de me plaindre du fait que ce que j'ai transmis n'a pas de méthode ou de variable spécifique, ou d'attendre beaucoup plus tard dans l'exécution du script que mon objet transmis soit utilisé, je préférerais de loin une erreur message, exactement là où je spécifie un objet de type incorrect, se plaignant de ce que le type de l'objet est incorrect ou incompatible.

Comment gérez-vous ces situations dans votre code? Comment détectez-vous les types incompatibles? Comment puis-je introduire une vérification de type dans mes scripts afin d'obtenir des messages d'erreur plus faciles à comprendre?

Aussi, comment pouvez-vous faire tout cela en tenant compte de l'héritage en PHP? Considérez:

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

   }
}
?>

Ensuite, un utilisateur de ce code implémente l'interface avec sa propre classe concrète:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

Je souhaite que les instances de ConcreteClass, ainsi que tous les futurs objets définis par l'utilisateur inconnus, soient également acceptables pour SetObject. Comment rendriez-vous cela possible en vérifiant le type correct?

Était-ce utile?

La solution

En fait, pour les classes, vous pouvez fournir des indications de type en PHP (5 +).

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

Cela fonctionnera également correctement avec l'héritage, comme vous le souhaiteriez.

En passant, ne mettez pas le mot "objet" dans les noms de classe ...

Autres conseils

En complément de la réponse d'Eran Galperin, vous pouvez également utiliser l'indicateur de type pour forcer les paramètres à être des tableaux - et pas uniquement des objets d'une certaine classe.

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

Comme vous pouvez le voir, vous pouvez taper un indice que la méthode :: passMeAnArray () attend un array et fournit une valeur par défaut dans le cas où la méthode est appelée w / o tous les paramètres.

Pour les types primitifs, vous pouvez également utiliser les fonctions is_ *:

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

Vous voyez, il existe de nombreuses réponses sur les indications de type. : voilà la solution technique. Mais vous devez également vous assurer que la conception dans son ensemble est sensible et intuitive. Cela rendra les problèmes de type et les erreurs plus rares.

N'oubliez pas que même ces échecs de type seront générés lors de l'exécution . Assurez-vous de disposer de tests pour le code.

Même dans le cas que vous décrivez, votre script se plantera en se plaignant de l'absence de méthode / attribut X sur l'objet Y, vous saurez ainsi d'où vient cet élément.

Quoi qu’il en soit, je pense qu’essayer toujours d’empêcher les grands programmeurs de transmettre le mauvais objet à une méthode n’est pas un bon investissement en temps: vous pourriez le dépenser pour la documentation et la formation.

Vous avez besoin de dactylographie et de collègues prudents, pas de vérifications supplémentaires qui rendront votre application plus rigide.

Mais ce peut être un point de vue pythoniste ...

@ Eran Galperin La réponse de est la méthode recommandée pour s'assurer que l'objet que vous utilisez est du type correct.

Il est également intéressant de noter l'opérateur instanceOf . Il est utile lorsque vous souhaitez vérifier objet est l'un des types multiples.

Vous pouvez définir le paramètre ini error_reporting dans votre fichier php.ini ou utiliser la fonction error_reporting pour le définir au moment de l'exécution

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top