Operator bierze jedną lub więcej wartości i tworzy nową: $a + $b dodaje, $a . $b łączy łańcuchy, $a && $b to logiczne AND, $a === $b porównuje, $i++ zwiększa o jeden.
/ zwraca float, chyba że dwie liczby całkowite dzielą się bez reszty: 17 / 5 daje 3.4, a 10 / 5 liczbę całkowitą 2. Gdy chcesz tylko część całkowitą, użyj intdiv(). Zaokrąglanie opisuje strona o matematyce.
Operatory arytmetyczne
| Operator | Nazwa | Przykład | Wynik |
|---|---|---|---|
+ | Dodawanie | 7 + 2 | 9 |
- | Odejmowanie | 7 - 2 | 5 |
* | Mnożenie | 7 * 2 | 14 |
/ | Dzielenie | 7 / 2 | 3.5 |
% | Modulo (reszta) | 7 % 2 | 1 |
** | Potęgowanie | 7 ** 2 | 49 |
-$a | Negacja | -7 | -7 |
Modulo przydaje się do „co N-tego elementu” i sprawdzania parzystości. Wynik ma znak lewej strony, a dzielenie przez zero rzuca błąd, który można przechwycić:
Operatory przypisania
= zapisuje wartość. Każdy operator arytmetyczny i tekstowy ma formę złożoną, która aktualizuje zmienną w miejscu.
??= należy do rodziny operatora null coalescing. Przypisuje tylko wtedy, gdy zmienna nie jest ustawiona albo ma wartość null.
Inkrementacja i dekrementacja: ++ i --
$i++ zwraca bieżącą wartość, a potem dodaje 1. ++$i dodaje 1, a potem zwraca nową wartość. Różnicę widać dopiero wtedy, gdy używasz wyniku w tym samym wyrażeniu.
Sztuczkę z literami często wykorzystuje się do generowania nazw kolumn arkusza (A, B, ... Z, AA).
Operatory logiczne: &&, ||, ! i xor
| Operator | Prawda, gdy |
|---|---|
$a && $b | oba są prawdą |
$a || $b | co najmniej jeden jest prawdą |
!$a | $a jest fałszem |
$a xor $b | dokładnie jeden jest prawdą |
$a and $b, $a or $b | to samo co && i ||, z niższym priorytetem |
&& i || działają skrótowo: prawa strona nie jest obliczana, gdy lewa już przesądza o wyniku. Dzięki temu isset($user) && $user->isAdmin() jest bezpieczne.
and vs &&: pułapka priorytetu
and i or wiążą słabiej niż =, więc w przypisaniu działają dopiero po zapisaniu wartości. To klasyczny błąd:
Niski priorytet przydaje się w jednym idiomie, $file = fopen($path, 'r') or die('Cannot open');, gdzie przypisanie ma nastąpić najpierw. Wszędzie indziej używaj && i ||.
Operatory tekstowe: . i .=
PHP ma dwa operatory tekstowe: . łączy dwa łańcuchy ("Grace" . " " . "Hopper"), a .= dopisuje do zmiennej ($html .= "<li>"). + nigdy nie łączy łańcuchów: "3" + "4" to liczba 7, a "3" . "4" to łańcuch "34". Strona o łańcuchach opisuje interpolację i cudzysłowy.
Porównania i operator spaceship <=>
== porównuje po konwersji typów, === sprawdza też typ, a <=> zwraca -1, 0 albo 1, czyli dokładnie to, czego potrzebują funkcje porównujące przy sortowaniu. Szczegóły i pełna tabela luźnych porównań są na stronie o operatorach porównania.
Operatory tablicowe
+ na tablicach to suma: klucze z lewej tablicy wygrywają, a z prawej dodawane są tylko brakujące klucze. To zaskakuje osoby, które spodziewają się dopisania. == sprawdza te same pary klucz/wartość, === wymaga też tej samej kolejności i typów.
Aby dopisać jedną listę do drugiej, użyj array_merge() albo składni rozpakowania [...$a, ...$b].
Priorytet operatorów
Gdy wyrażenie miesza operatory, PHP stosuje je w ustalonej kolejności. Te, na których ludzie się potykają, z tym, co wypisuje PHP 8.3:
echo 2 + 3 * 4; // 14: * before +
echo (2 + 3) * 4; // 20
echo 2 ** 3 ** 2; // 512: right to left, 2 ** 9
echo -2 ** 2; // -4: ** before unary minus
echo "Sum: " . 2 + 3; // Sum: 5, since PHP 8 + runs before .
W razie wątpliwości dodaj nawiasy. Nic nie kosztują, a następna osoba czytająca linię nie musi pamiętać tabeli.
Najczęściej zadawane pytania
Czym różni się and od && w PHP?
Oba to logiczne AND, ale and ma niższy priorytet niż =. Dlatego $x = true and false; zapisuje true w $x (przypisanie dzieje się najpierw), a $x = true && false; zapisuje false. W wyrażeniach używaj && i ||, a and/or trzymaj z dala od przypisań.
Co robi % w PHP?
% to operator modulo: zwraca resztę z dzielenia całkowitego, więc 10 % 3 daje 1. Wynik ma znak lewego operandu (-7 % 3 daje -1). Dla floatów użyj fmod(), a % 0 rzuca DivisionByZeroError.
Jak podnieść liczbę do potęgi w PHP?
Użyj operatora **: 2 ** 10 daje 1024. Jest prawostronnie łączny, więc 2 ** 3 ** 2 to 2 ** 9 = 512, i wiąże silniej niż jednoargumentowy minus, więc -2 ** 2 daje -4. Funkcja pow(2, 10) robi to samo.
Czym różni się $i++ od ++$i w PHP?
Oba dodają 1 do $i. $i++ (postinkrementacja) zwraca starą wartość, a potem zwiększa; ++$i (preinkrementacja) najpierw zwiększa i zwraca nową wartość. W osobnej linii, jak krok pętli for, nie ma różnicy.