90 votes

Devrais-je utiliser assert dans mon code PHP?

Un co-travailleur a ajouté le faire valoir de commande quelques fois dans nos bibliothèques dans des endroits où j'aurais utilisé une instruction if et la levée d'une exception. (Je n'avais même jamais entendu parler de faire valoir à ce sujet). Voici un exemple de la façon dont il l'a utilisé:

assert('isset($this->records); /* Records must be set before this is called. */');

Je l'aurais fait:

if (!isset($this->records)) {
    throw new Exception('Records must be set before this is called');
}

À la lecture de l'PHP docs sur l'affirmer, il semble qu'il est recommandé assurez-vous affirmer, c'est actif et ajouter un gestionnaire avant d'utiliser assert. Je ne peux pas trouver un endroit où il fait cela.

Donc, ma question est, est à l'aide d'affirmer une bonne idée étant donné ci-dessus et que je devrais l'utiliser plus souvent au lieu de si et des exceptions?

Une autre note, nous planification de l'utilisation de ces bibliothèques sur une variété de projets et les serveurs, y compris les projets que nous ne pouvons même pas être de la partie (les bibliothèques de l'open source). N'est-ce pas de différence dans l'utilisation de l'affirment?

83voto

aaronasterling Points 25749

La règle de base qui est applicable dans la plupart des langues (tout ce que je sais vaguement) est qu'un assert est utilisée pour affirmer que la condition est toujours vraie, alors qu'un if est appropriée si elle est concevable qu'il peut parfois échouer.

Dans ce cas, je dirais qu' assert est approprié (basé sur ma faible compréhension de la situation), car records doit toujours être mis en avant la méthode est appelée. Donc un échec pour définir le record serait un bug dans le programme, plutôt que d'une condition d'exécution. Ici, l' assert contribue à assurer (avec les tests adéquats) qu'il n'est pas possible l'exécution d'un programme voie qui pourrait provoquer le code qui est gardé avec l' assert d'être appelé sans records ont été établis.

L'avantage de l'utilisation d' assert plutôt if que assert peuvent généralement être désactivée dans le code de production ainsi réduire les frais généraux. Le genre de situations qui sont mieux pris avec de l' if pourrait éventuellement se produire lors de l'exécution dans le système de production et donc rien n'est perdu par ne pas être en mesure de les désactiver.

29voto

DaveWalley Points 99

Pensez affirme que "le travail de commentaires". Plutôt qu'un commentaire comme:

// Note to developers: the parameter "a" should always be a number!!!

utilisation:

assert('is_numeric(a) /* The parameter "a" should always be a number. */');

Les significations sont exactement les mêmes, et qui sont destinés pour le même public, mais le premier commentaire est facilement oubliée ou ignorée (peu importe le nombre de points d'exclamation), tandis que la "commentaire" n'est pas seulement disponible pour les humains à lire et à comprendre, il est aussi constamment à la machine testée au cours du développement, et de ne pas être ignoré si vous définissez un bon faire valoir la manipulation dans le code et dans les habitudes de travail.

Vu de cette façon, les assertions sont un concept complètement différent que si(erreur)... et des exceptions, et elles peuvent co-exister.

Oui, vous devriez commentaire de votre code, et oui, vous devriez être en utilisant de travail "commentaires" (affirme) chaque fois que possible.

16voto

mario Points 76989

Tout dépend de votre stratégie de développement. La plupart des développeurs ne connaissent assert() et l'utilisation en aval de l'unité de test. Mais proactive et intégrée dans des programmes d'analyse peut parfois être avantageux.

affirmer, c'est utile, car il peut être activé et désactivé. Il n'a pas de vidange de la performance si une telle affirmation gestionnaire est défini. Votre collègue n'en a pas, et vous devriez élaborer un code temporaire qui permet à l'environnement de développement (si E_NOTICE/E_WARNINGs, donc devrait être l'affirmation de gestionnaire). J'utilise de temps en temps où mon code ne peut pas l'estomac mixte types de variables - je ne suis pas normalement s'engager dans la plus stricte en tapant dans un faiblement typé PHP, mais il y a aléatoires cas d'utilisation:

 function xyz($a, $b) {
     assert(is_string($a));
     assert(is_array($b));

Qui, par exemple, permettrait de compenser le manque de spécificateurs de type string $a, array $b. PHP5.4 les soutenir, mais ne pas consulter.

8voto

Mark Snidovich Points 864

Assert n'est pas un substitut au contrôle de flux normal, comme if ou d'exceptions, car il est uniquement destiné à être utilisé pour le débogage pendant le développement.

3voto

Piontek Media Points 837

Assert ne doit être utilisé que dans le développement, car il est utile pour le débogage. Donc, si vous le souhaitez, vous pouvez les utiliser pour développer votre site Web, mais vous devez utiliser des exceptions pour un site Web actif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X