web-dev-qa-db-fra.com

dois-je lever l'exception du constructeur?

Je sais que je peux lever l'exception du constructeur dans PHP mais dois-je le faire? Par exemple, si la valeur d'un paramètre n'est pas telle que je l'attendais.

Ou devrais-je différer de lever une exception jusqu'à ce qu'une méthode soit invoquée. Quels sont les avantages et les inconvénients dans les deux cas?

46
WordsWorth

Pourquoi voudriez-vous reporter la levée de l'exception?

Si vous savez que l'objet ne peut pas instancier correctement avec les paramètres donnés, vous devez certainement lever une exception.

Sinon, quelqu'un pourrait tester votre objet pour null, ce qui ne sera pas le cas, et pourrait supposer que tout s'est déroulé comme prévu.

Il y a beaucoup de choses qui peuvent être faites à votre objet sans appeler de méthode dessus: il pourrait être ajouté à une liste, il pourrait être comparé, il pourrait être envoyé en tant que paramètre, etc etc etc. Toutes ces choses sont des choses cela n'aurait pas dû arriver, étant donné qu'il ne s'agit pas d'un objet valide.

76
Andrei G

Si votre constructeur est invoqué avec des paramètres incorrects, vous devez (devez?) Lever une exception. Si vous ne le faites pas, vous pourriez obtenir un mauvais objet qui ne se comportera pas comme prévu.

21
Peter Kiss

Absolument!!

Vous devez lever l'exception si les paramètres de construction de l'objet ne sont pas valides ou ne sont pas conformes au contrat. Ce n'est pas une bonne idée d'aller de l'avant avec le flux sachant que l'objet est construit avec de mauvaises données qui peuvent causer de nombreux problèmes si vous autorisez l'appelant à aller de l'avant.

Il est toujours préférable de "FAIL FAST AND FAIL EARLY"

17
java_mouse

Je sais que je peux lever l'exception du constructeur dans PHP mais dois-je le faire?

C'est la seule manière sensée d'informer que la construction de l'objet a échoué.

7
BЈовић

Pourquoi ne valideriez-vous pas l'ensemble de paramètres avant d'instancier votre objet? Cela garantirait que votre objet serait créé, supprimant ainsi tout effet secondaire pouvant survenir suite à son échec.

Bien que je sache que vous pouvez vérifier les choses dans votre constructeur et lancer des exceptions, je préfère écrire mes constructeurs de manière à ce qu'ils n'échouent pas. J'effectue la validation des paramètres avant d'instancier des objets que je peux ensuite lancer des exceptions sans faire échouer mes constructeurs. En général, je n'essaie pas non plus d'instancier de nouveaux objets dans mes constructeurs, mais plutôt de les instancier selon mes besoins.

Juste mon avis. PHP offre beaucoup de liberté - profitez-en!

3
Tony Mays