est-ce correct d'utiliser @ lors de l'extraction d'une valeur éventuellement manquante d'un tableau PHP? Exemple: Le comportement prévu: p> Je veux savoir, avant de diffuser le modèle d'utilisation. P> P> P> >
6 Réponses :
Le Ainsi, je préférerais beaucoup le deuxième bit. Cela rend beaucoup plus clair p>
Pour le rendre plus concis, vous pouvez utiliser l'opérateur conditionnel ternaire @ code> supprime les messages d'erreur et l'utiliser potentiellement em> définit votre code pour d'autres erreurs et un comportement imprévu qui se retrouve difficile à suivre. Ainsi, c'est très certainement un anticipateur. P>
?: code>, comme on le voit dans La réponse de Mark Baker . Légèrement moins de code et plus de symboles, mais la signification est bien reconnue. P>
Je comprends. La sécurité @ Usage pourrait induire en erreur les autres développeurs à l'utiliser sur les mauvais endroits.
ou
+1 Si vous utilisez php> = 5.3 Vous pouvez utiliser la nouvelle forme plus courte: Isset ($ TRAY ["éventuellement_missing_key '])?: Null; code>
@WebBieveAve: Non, cela retournerait le résultat de isset (...) code> et non la valeur réelle de la matrice.
@WebBiiedave: cette version courte fonctionnera-t-elle dans ce cas? Ne retournera-t-il pas la valeur du isset () code> (c'est-à-dire vrai ou faux) plutôt que la variable elle-même?
Soudain, je plaisante pour l'opérateur null-coalescent ( quelquevar ?? SomedefaultValue code>) trouvé dans c # ...
Oh Snap! Eh bien, je laisserai le commentaire afin qu'il puisse voir la forme plus courte pour une utilisation future.
Ignorer les avertissements est définitivement un anticipateur; Donc, oui, c'est un anti-motif (et je peux garantir que si vous apprenez à supprimer des avertissements, l'un d'entre eux reviendra et vous mordre dans la postérieure, sinon pire). P>
De plus, alors que la deuxième version est plus verbeuse, elle donne à la variable non initialisée un état connu (ou peut être utilisé pour gérer le problème, si la variable est supposée être remplie). P>
La troisième option:
$value = (isset($array['key']) ? $array['key'] : null);
Ce n'est pas vraiment une troisième option, c'est une formatage différente de l'option 2 (car elle est fonctionnellement identique). Diriez-vous que si (x) {quelque chose} code> et
si (! X) {} else {quelque chose} code> sont deux solutions différentes, car elles ne sont pas écrites de la même manière ?
@Piskvor - HM, c'est un peu pointilleux. C'est une syntaxe différente, alors je dirais que oui, c'est une troisième option, même s'il est effectivement identique à son code d'origine. Mais mon argument était de fournir une manière à une doublure de le faire sans utiliser @ code>, car cela semblait être là où sa question était inclinée.
Eh bien, je suis en quelque sorte sur la clôture à ce sujet. La syntaxe est différente, mais elle fait la même chose. Vous avez raison que c'est moins verbeux, tout en gardant la fonctionnalité. (Je suppose que cela en dit de plus sur mes poussées de nitpicking que de la question à portée de main;))
Le deuxième bloc de code (ou la variante de marque Baker qui fonctionnera exactement la même chose) est meilleure. Je ne suis pas tout à fait sûr de PHP, mais dans de nombreuses autres langages de programmation, d'ignorer simplement une variable lancerait presque définitivement une erreur. Au moins avec le deuxième bloc, vous initialisez la variable à une valeur ou à la mémoire de la mémoire. P>
La suppression des erreurs doit être plus couramment utilisée si vous vous attendez à une fonction de lancer une erreur attendue dans le produit final (toutefois, une grande partie du temps ne sera pas le cas). P>
bonne chance!
Dennis m. P>
En réalité, la variation code> isset est l'anti-motif. Si vous utilisez simplement Les gens se disputent pour cela en raison de la "propreté" perçue et parce que l'utilisation d'Isset est une micro optimisation. Éviter isset ($ var)? $ Var: null code> avec l'intention de supprimer "l'erreur", vous n'avez rien obtenu à l'aide de la syntaxe appropriée pour supprimer des erreurs. Il a le même résultat, mais est moins lisible. P>
@ code> et utiliser Isset comme remplacement de sel syntaxique est juste une programmation de Cult de cargaison. P>
Merci d'avoir mentionné une vue contrarian.
@IVODANIHELKA: En fait, je veux retirer et ajouter un gros Tout dépend b>. Il n'y a pas un seul modèle qui correspond à tous les cas d'utilisation. Soyez flexible et non religieux sur Isset / @, utilisez le meilleur outil pour le travail à portée de main.
Suis-je le seul à utiliser Array_Key_exists au lieu d'Isset Pour ce genre de choses?
(Sidenote) i>
Isset code> ne détecte pas une clé probablement manquante i>. Utilisez
array_key_existes code> pour cela. Essayez
$ arr = tableau ('nomenting' => null); code> avec
isset code>
@Alexv @gordon: Je ne pense pas que cela compte car la valeur par défaut est null de toute façon: p
@ALEXV - éventuellement, micro-optimisation, je sais, mais je trouve Evet () d'être plus rapide que Array_Key_exists () ... probablement parce que c'est une construction de langue plutôt qu'une fonction (avec toutes les fonctions de la fonction correspondant)
Je suis avec @alexv sur celui-ci. Il existe une différence sémantique entre une clé manquante et une clé existante avec une valeur de
null code>
J'ai envisagé d'utiliser Array_Key_exists () dans l'exemple. Cela entraînerait des observations que Isset () est plus courte pour obtenir le même comportement.
@IVO DANIHELKA: Vous avez raison. Je viens de montrer que les gens optimiseront quelque chose et tout pour obtenir 3 NS Boost sur un script qui fonctionne pendant 500 ms une fois par semaine et un comportement qui est presque i> la même chose, sauf quand ce n'est pas le cas. soupir i>.