88 votes

Que fait l'utilisation d'un seul tube '|' dans un argument de fonction ?

Prenons par exemple le code suivant :

phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);

Un seul argument est utilisé, mais je fournis une liste d'options séparées par un seul symbole de tuyau.

  • Que se passe-t-il exactement avec la valeur de l'argument dans la fonction ?
  • Puis-je utiliser la même chose dans mes propres fonctions ?
  • Si oui, comment, et y a-t-il des avantages à cela plutôt que de passer un tableau à la place ?

0 votes

C'est la version bitwise de OR, la version normale aurait deux tuyaux.

32 votes

Vous savez, je n'en reviens pas de la façon dont certains commentateurs rabaissent la volonté des utilisateurs de poser des questions... Au point qu'il faut un utilisateur avec 210K rep pour y répondre !

5 votes

Je me demande si un utilisateur avec une réputation > 5000 sur SO qui n'a posé aucune question n'a vraiment aucune question ou considère que poser des questions est un signe de faiblesse ?

154voto

pebbl Points 8909

Opérateurs binaires

Les opérateurs binaires modifient les bits des valeurs concernées. Un opérateur bit à bit OR En fait, il fait un OU entre chaque bit de l'argument gauche et de l'argument droit. Par exemple :

5 | 2

Se traduirait en bits/binaire par :

101 | 10

Ce qui aurait pour conséquence :

111

Parce que :

1 || 0 = 1
0 || 1 = 1
1 || 0 = 1

Et en tant que nombre entier, c'est la représentation de 7, ce qui est exactement ce que vous obtenez si vous :

echo 5 | 2;

Selon les mots d'Eddie Izzard... Drapeau !

Comme l'indique Ignacio, cette méthode est le plus souvent utilisée en PHP (et dans d'autres langages) pour combiner plusieurs drapeaux. Chaque drapeau est généralement défini comme une constante dont la valeur est normalement fixée à un nombre entier qui représente un seul bit à un décalage différent :

define('FLAG_A', 1); /// 0001
define('FLAG_B', 2); /// 0010
define('FLAG_C', 4); /// 0100
define('FLAG_D', 8); /// 1000

Ensuite, quand vous OR ces derniers ensemble, ils fonctionnent chacun sur leur propre décalage de bits et n'entreront jamais en collision :

FLAG_A | FLAG_C

Traduit à :

1 | 100

Donc tu finis par t'allumer :

101

Ce qui représente le nombre entier 5.

Ensuite, tout ce que le code doit faire - le code qui réagira aux différents drapeaux mis en place - est le suivant (en utilisant une fonction bitwise AND ) :

$combined_flags = FLAG_A | FLAG_C;

if ( $combined_flags & FLAG_A ) {
  /// do something when FLAG_A is set
}

if ( $combined_flags & FLAG_B ) {
  /// this wont be reached with the current value of $combined_flags
}

if ( $combined_flags & FLAG_C ) {
  /// do something when FLAG_C is set
}

En fin de compte, le fait d'avoir des constantes nommées rend les choses plus faciles à lire et, de manière générale, plus optimales en s'appuyant sur des valeurs entières plutôt que sur des chaînes ou des tableaux. Un autre avantage de l'utilisation de constantes est que si elles sont mal saisies lors de leur utilisation, le compilateur est mieux placé pour le savoir et pour lancer un avertissement... si une valeur de chaîne est utilisée, il n'a aucun moyen de savoir que quelque chose ne va pas.

define('MY_FLAG_WITH_EASY_TYPO', 1);

my_function_that_expects_a_flag( MY_FLAG_WITH_EASY_TPYO );

/// if you have strict errors on the above will trigger an error

my_function_that_expects_a_flag( 'my_string_with_easy_tpyo' );

/// the above is just a string, the compiler knows nowt with 
/// regard to it's correctness, so instead you'd have to
/// code your own checks.

5 votes

+1 pour ce grand article. J'avais beaucoup de mal à me faire une idée de tout cela, mais vos explications et vos exemples m'ont aidé à comprendre beaucoup plus facilement que si j'avais simplement lu la documentation PHP. Merci beaucoup.

3 votes

@cryptic pas de soucis -- après tout, chercher quelque chose que l'on ne peut pas nommer est plutôt délicat -- maintenant si seulement Google acceptait des paragraphes d'explications et d'exemples comme terme de recherche :)

4 votes

Excellentes explications et exemples ! +1

18voto

Vous passez un argument qui est le OU binaire de drapeaux multiples . Vous pouvez utiliser l'opérateur partout où vous le souhaitez.

11 votes

Merci, @Ignacio, de ne pas oublier que tout le monde à l'OS n'est pas un expert en programmation, ni même ne sait par où commencer pour la documentation.

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