2010-08-28 21 views
15

je tente de créer une fonction avec des drapeaux comme ses arguments, mais la sortie est toujours différent avec ce qui est attendu:Drapeaux de fonction PHP, comment?

define("FLAG_A", 1); 
define("FLAG_B", 4); 
define("FLAG_C", 7); 
function test_flags($flags) { 
if($flags & FLAG_A) echo "A"; 
if($flags & FLAG_B) echo "B"; 
if($flags & FLAG_C) echo "C"; 
} 
test_flags(FLAG_B | FLAG_C); # Output is always ABC, not BC 

Comment puis-je résoudre ce problème?

Répondre

25

Les drapeaux doivent avoir une puissance de 2 pour être mis en parallèle bit à bit ou ensemble.

define("FLAG_A", 0x1); 
define("FLAG_B", 0x2); 
define("FLAG_C", 0x4); 
function test_flags($flags) { 
    if ($flags & FLAG_A) echo "A"; 
    if ($flags & FLAG_B) echo "B"; 
    if ($flags & FLAG_C) echo "C"; 
} 
test_flags(FLAG_B | FLAG_C); # Now the output will be BC 

En utilisant la notation hexadécimale pour les valeurs constantes ne fait aucune différence sur le comportement du programme, mais est une façon de mettre l'accent idiomatiques aux programmeurs que les valeurs composent un bit field. Un autre serait d'utiliser des quarts: 1<<0, 1<<1, 1<<2, & c.

+0

Aah, merci beaucoup pour votre aide! – Teiv

+2

Mec, les attentes de sortie de votre commentaire ne va pas. Parce que la sortie sera toujours autrement - BC plutôt que ABC et c'est un bon comportement pour le programme. –