Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Operatory bitowe i definicje
Forum PHP.pl > Forum > PHP
Seth
Ciezko zadac jedno pytanie bez przedstawienia tego co juz mam, wiec zaczne od poczatku:


Wpadlem na pomysl ujednolicenia kilku metod w mojej klasie i zrobienia z niej jednej.
Do tej pory mialem takie metody jak:
Cytat
sendErrorMsg()
sendActivationMsg()
sendFailureMsg()


...a obecnie:
Cytat
sendMsg($flag)


gdzie $flag to wartosc jednej z definicji ponizej:
  1. <?php
  2. define('MSG_ERROR', 1);
  3. define('MSG_ACTIVATION', 2);
  4. define('MSG_FAILURE', 4);
  5. ?>


Jezeli chce wyslac wiadomosc typu MSG_ERROR to daje:
sendMsg(ERROR_MSG);
(Wczesniej dawalem zamiast tego sendErrorMsg())

I wszystko ladnie pieknie bo wewnatrz medoty sendMsg() mam switcha, ktory robi mniej wiecej tyle:

  1. <?php
  2. ...
  3. switch ($flag) {
  4.  case MSG_ERROR:
  5. $msg .= 'jakis tam error';
  6. break;
  7.  case MSG_ACTIVATION:
  8. $msg .= 'jakis tam activation';
  9. break;
  10.  case MSG_FAILURE:
  11. $msg .= 'przykro mi tongue.gif';
  12. break;
  13. }
  14. ...
  15. // (tutaj kod, ktory sie powtarzal w metodach send*Msg())
  16. ...
  17.  
  18. ?>


Ale.... chce miec mozliwosc przeslania "kilku wiadomosci" czyli chce moc zrobic tak:
sendMsg(MSG_ERROR | MSG_ACTIVATION);
itp.

Tylko, ze nie wiem jak to obsluzyc w switchu. Bo za pomoca IFa moge np zorientowac sie czy mam jakas z wiadomosci (MSG_*) np tak:
  1. <?php
  2. if ($flag & MSG_ERROR) ...
  3. ?>


Ale czy rzeczywiscie trzeba pisac mase if'ow do tego? Czy nie da sie jakos switcha skonstruowac tak aby zadzialalo z takim zlozeniem flag?
FiDO
switch z zalozenia wykonuje tylko jedna z opcji (pomijajac fakt, ze mozna nie napisac break'a, ale w tym przypadku sie to nie przyda), wiec raczej ciezko to widze bez if'ow. Ewentualnie mozna sprobowac zrobic petle po wszystkich flagach, wtedy moglbys miec switcha, tylko ze w kazdym case'ie musialbys usuwac wlasnie "wykonana" flage, zeby nie wszedl kilka razy do tego samego.
Troche to na sile, ale jak koniecznie chcesz switcha to jest to jakis pomysl winksmiley.jpg
Hacker
albo wygodniej (jeżeli flag (nie: flagów) jest bardzo dużo) też można za pomocą tablicy w której trzymasz to co dodajesz w kolejności od tego czemu odpowiada 1 poprzez 2, 4, 8 itd. i robisz pętle
  1. <?php
  2.  
  3. $t=1;
  4. for($i=0; $i<count($tablica); $i++, $t*2)
  5. {
  6. if (($flag & $t) == $t)
  7. {
  8. $msg .= $tablica[i];
  9. }
  10. }
  11. ?>


----------
--
poprawilem blad
, a drugiego('poptez') nie znalazłeś tongue.gif (Hacker)
dr_bonzo
orson
witam ...

może być jeden switch ale musi być w pętli ...
  1. <?php
  2.  
  3. switch (true){
  4.  case ($flag & MSG_ERROR):
  5. $flag -= MSG_ERROR
  6.  case ($flag & MSG_ACTIVATION):
  7. }
  8.  
  9. ?>

itp ... ale za każdym razem musisz odjąć stałą od flagi ...

poza tym możesz spróbować jakoś z logicznym and żeby sprawdzić jakie przyszły ale to też jakoś z pętlą ...

pozdrawiam
em1X
  1. <?php
  2.  
  3. define('ADMIN',8);
  4. define('MOD', 4);
  5. define('USER', 2);
  6. define('LEECH', 1);
  7. $perms = array('ADMIN'=>8,'MOD'=>4,'USER'=>2,'LEECH'=>1);
  8.  
  9. $user = MOD | USER;
  10.  
  11. foreach ($perms as $key => $val)
  12. {
  13. if (rights($user, $val))
  14. echo "I am $key<br />";
  15. else
  16. echo "I am not $key<br />";
  17. }
  18.  
  19. function rights($u, $perm)
  20. {
  21. if (!($u & $perm))
  22. return false;
  23.  
  24. return true;
  25. }
  26. ?>


output:

Kod
I am not ADMIN
I am MOD
I am USER
I am not LEECH
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.