9
votes

Est-ce que @ $ arrayer ['éventuellement_missing_key'] un anti-motif?

est-ce correct d'utiliser @ lors de l'extraction d'une valeur éventuellement manquante d'un tableau PHP? Exemple: xxx

Le comportement prévu: xxx

Je veux savoir, avant de diffuser le modèle d'utilisation. >


7 commentaires

Suis-je le seul à utiliser Array_Key_exists au lieu d'Isset Pour ce genre de choses?


(Sidenote) Isset ne détecte pas une clé probablement manquante . Utilisez array_key_existes pour cela. Essayez $ arr = tableau ('nomenting' => null); avec isset


@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


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 la même chose, sauf quand ce n'est pas le cas. soupir .


6 Réponses :


8
votes

Le @ supprime les messages d'erreur et l'utiliser potentiellement 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.

Ainsi, je préférerais beaucoup le deuxième bit. Cela rend beaucoup plus clair

  • qu'il peut ne pas être présent dans la matrice et
  • Quelle est la valeur par défaut si elle n'est pas présente

    Pour le rendre plus concis, vous pouvez utiliser l'opérateur conditionnel ternaire ?: , 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.


1 commentaires

Je comprends. La sécurité @ Usage pourrait induire en erreur les autres développeurs à l'utiliser sur les mauvais endroits.



4
votes

ou xxx


5 commentaires

+1 Si vous utilisez php> = 5.3 Vous pouvez utiliser la nouvelle forme plus courte: Isset ($ TRAY ["éventuellement_missing_key '])?: Null;


@WebBieveAve: Non, cela retournerait le résultat de isset (...) 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 () (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 ) trouvé dans c # ...


Oh Snap! Eh bien, je laisserai le commentaire afin qu'il puisse voir la forme plus courte pour une utilisation future.



1
votes

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).

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).


0 commentaires

1
votes

La troisième option:

$value = (isset($array['key']) ? $array['key'] : null);


3 commentaires

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} et si (! X) {} else {quelque chose} 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 @ , 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;))



1
votes

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.

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).

bonne chance!
Dennis m.


0 commentaires

7
votes

En réalité, la variation isset est l'anti-motif. Si vous utilisez simplement isset ($ var)? $ Var: null 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.

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 @ et utiliser Isset comme remplacement de sel syntaxique est juste une programmation de Cult de cargaison.


2 commentaires

Merci d'avoir mentionné une vue contrarian.


@IVODANIHELKA: En fait, je veux retirer et ajouter un gros Tout dépend . 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.