Weźmy na przykład następujący kod:
phpinfo(INFO_MODULES | INFO_ENVIRONMENT | INFO_VARIABLES);
Używany jest pojedynczy argument, ale podaję listę opcji oddzielonych pojedynczym symbolem potoku.
- Co dokładnie dzieje się z wartością argumentu w funkcji?
- Czy mogę używać tego samego we własnych funkcjach?
- Czy tak, jak i czy są z tego korzyści w porównaniu z przekazaniem zamiast tego tablicy?
php
function
arguments
bitwise-operators
tajemnicze ツ
źródło
źródło
Odpowiedzi:
Operatory bitowe
Operatory bitowe modyfikują bity odpowiednich wartości. Bitowe w
OR
zasadzie OR łączy razem każdy bit lewego i prawego argumentu. Na przykład:5 | 2
Przetłumaczyłoby się na bity / binarne jako:
101 | 10
Co spowodowałoby:
111
Dlatego:
1 || 0 = 1 0 || 1 = 1 1 || 0 = 1
I jako liczba całkowita, która jest reprezentacją liczby 7, która jest dokładnie tym, co otrzymujesz, jeśli:
echo 5 | 2;
Słowami Eddiego Izzarda… Flaga!
Jak stwierdza Ignacio, jest to najczęściej używane w PHP (i innych językach) jako sposób łączenia wielu flag. Każda flaga jest zwykle definiowana jako stała, której wartość jest zwykle ustawiana na liczbę całkowitą reprezentującą tylko jeden bit w innym przesunięciu:
define('FLAG_A', 1); /// 0001 define('FLAG_B', 2); /// 0010 define('FLAG_C', 4); /// 0100 define('FLAG_D', 8); /// 1000
Wtedy, kiedy to zrobisz
OR
razem, działają one na swoim własnym bitowym przesunięciu i nigdy się nie zderzają:Przetłumaczyć na:
1 | 100
Więc w końcu włączasz:
101
Która reprezentuje liczbę całkowitą 5.
Następnie wszystko, co musi zrobić kod - kod, który będzie reagował na różne ustawiane flagi - jest następujące (używając bitowej
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 }
Pod koniec dnia po prostu ułatwia to czytanie, ponieważ ma nazwane stałe i ogólnie jest bardziej optymalne, polegając na wartościach całkowitych, a nie na łańcuchach lub tablicach. Inną zaletą używania stałych jest to, że jeśli zostaną one kiedykolwiek wpisane błędnie, kompilator jest w lepszej sytuacji, aby o tym powiedzieć i rzucić ostrzeżenie ... jeśli zostanie użyta wartość ciągu, nie ma możliwości dowiedzenia się, że coś jest nie tak.
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.
źródło
Przekazujesz argument, który jest bitowym LUB wielu flag . Możesz używać operatora w dowolnym miejscu.
źródło