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.
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 ?
15 votes
Il faut également savoir que les symboles sont difficiles à rechercher.
9 votes
@nickhar et que pour atterrir sur cette page de documentation , il faudrait être familier avec le terme spécifique en premier lieu , ce qui est en quelque sorte le point entier de la question .