Operatory arytmetyczne PHP stanowią dość pokaźną grupę obejmującą 8 elementów. Część z nich już znasz, bo niczym nie różnią się od podstawowych działań arytmetycznych uczonych w szkole podstawowej. Ale czy znasz wszystkie? I czy wszystkimi umiesz się w pełni posługiwać? Zaraz się przekonasz.
W tym rozdziale poznasz odpowiedzi między innymi na następujące pytania:
- Czym są operatory arytmetyczne?
- Jakie są operatory arytmetyczne w PHP?
- Co robi % w PHP?
- Jak się oblicza resztę z dzielenia w PHP?
- Co to jest modulo w PHP?
- Czym są operatory inkrementacji i dekrementacji w PHP?
Jakie są operatory arytmetyczne w PHP
W języku PHP dostępnych jest 8 operatorów arytmetycznych, służących do wykonywania podstawowych działań arytmetycznych na liczbach: dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie, obliczanie reszty z dzielenia, negacja oraz tożsamość.
Dodatkowo w języku PHP dostępne są cztery operatory, których tradycyjnie nie zalicza się do kategorii arytmetycznych. Ponieważ jednak mają zbliżone zastosowanie, ich opis również postanowiłem umieścić w tym rozdziale. Są to operatory inkrementacji i dekrementacji.
Poniższa tabela zawiera zwięzłe zestawienie wszystkich operatorów PHP opisanych w tym rozdziale.
Operator | Nazwa | Przykład | Sposób działania |
---|---|---|---|
+ | Tożsamość | +$a; | Operator jednoargumentowy. Zamienia wartość $a odpowiednio na liczbę typu int lub float |
- | Negacja | -$a; | Operator jednoargumentowy. Zmienia znak wartości $a na przeciwny |
+ | Dodawanie | $a + $b | Sumuje $a i $b |
- | Odejmowanie | $a - $b | Odejmuje wartość $b od wartości $a |
* | Mnożenie | $a * $b | Mnoży wartości $a i $b |
/ | Dzielenie | $a / $b | Dzieli wartość $a przez wartość $b |
% | Dzielenie modulo (reszta z dzielenia) | $a % $b | Zwraca resztę z dzielenia wartości $a przez wartość $b |
** | Potęgowanie | $a ** $b | Zwraca wynik podniesienia $a do potęgi $b |
++$x | Preinkrementacja | ++$x | Zwiększa wartość $a o 1, po czym zwraca wartość $a |
$x++ | Postinkrementacja | $x++ | Zwraca wartość $a, po czym zwiększa wartość $a o 1 |
--$x | Predekrementacja | --$x | Zmniejsza wartość $a o 1, po czym zwraca wartość $a |
$x-- | Postdekrementacja | $x-- | Zwraca wartość $a, po czym zmniejsza wartość $a o 1 |
W większości przypadków operatory te działają dokładnie tak, jak można się spodziewać, czyli zgodnie z podstawowymi zasadami matematyki. Istnieją jednak pewne niuanse, o których warto wiedzieć.
Działania na liczbach różnego typu
Jeśli w operacji arytmetycznej biorą udział dwie liczby tego samego typu, np. dwie liczby typu int albo dwie liczby typu float
, to wynik również jest tego typu, np.:
var_dump(10 + 12); // Wynik: int(22)
W przypadku argumentów typu int może zostać zwrócona wartość typu float
. Dzieje się tak w przypadku, gdy wynik operacji nie mieści się w zakresie wartości tego typu. Zakres ten można sprawdzić przy użyciu stałej PHP_INT_MAX.
Jeśli natomiast przynajmniej jeden z argumentów działania jest typu float
, to wynik działania również jest typu float
, np.:
var_dump(10 * 2 + 12 - 2.5); // Wynik: float(29.5)
Działania na liczbach i łańcuchach
Jeśli argumentami działania arytmetycznego są liczba i łańcuch, to PHP próbuje przekonwertować ten łańcuch na typ liczbowy. Jeśli się mu uda, to wykona normalne działanie na dwóch liczbach i zwróci wynik odpowiedniego typu, np.:
var_dump(10 + "12"); // Wynik: int(22)
var_dump(10 + "16.8"); // Wynik: float(26.8)
var_dump(10 + "12" - 6 * "4" / 3); // Wynik: int(14)
var_dump(10 + "12e3"); // Wynik: float(12010)
Jeśli jednym z argumentów działania arytmetycznego jest liczba, a drugim tzw. łańcuch z wiodącą częścią liczbową (ang. leading numeric string), to PHP wykona działanie przy użyciu liczby wyłuskanej z tego łańcucha, ale dodatkowo zgłosi ostrzeżenie, np.:
var_dump(10 + "123abc");
Wynik:
Warning: A non-numeric value encountered in C:\xampp\htdocs\index.php on line 29 int(133)
Oczywiście ścieżka do pliku i numer wiersza mogą być inne. Tutaj widzisz, jak to wyglądało w mojej konfiguracji testowej.
Jeżeli natomiast jeden z argumentów operatora arytmetycznego nie będzie liczbą ani łańcuchem, który da się przekonwertować na liczbę, interpreter PHP zgłosi błąd krytyczny i nie wykona działania, np.:
var_dump(10 + "abc");
Wynik:
Fatal error: Uncaught TypeError: Unsupported operand types: int + string in C:\xampp\htdocs\index.php:29 Stack trace: #0 {main} thrown in C:\xampp\htdocs\index.php on line 29
Dzielenie w PHP
Operator dzielenia PHP dzieli pierwszy argument przez drugi. Jeśli oba argumenty są typu int lub zostaną zinterpretowane jako typu int oraz nie ma reszty z dzielenia, to wynik jest typu całkowitoliczbowego, np.:
var_dump(10 / 5); // Wynik: int(2)
var_dump(10 / "5aaa"); // Wynik: int(2)
var_dump(10 / 3); // Wynik: float(3.3333333333333335)
W drugim z tych przypadków interpreter dodatkowo wyda ostrzeżenie, że napotkał wartość, która nie jest liczbą, ale mimo to wykona działanie.
Operator dzielenia PHP wykonuje dzielenie zmiennoprzecinkowe, w wyniku którego możemy otrzymać liczbę ułamkową.
Jeśli chcesz sprawdzić, ile razy jedna liczba mieści się w innej w całości, czyli jeśli chcesz wykonać dzielenie całkowite, to możesz użyć funkcji PHP intdiv()
, np.:
var_dump(intdiv(15, 6)); // Wynik: int(2)
var_dump(intdiv(-19, 3)); // Wynik: int(-6)
I oczywiście próba dzielenia przez 0 zakończy się błędem krytycznym:
$a = 10 / 0; // Wynik: Fatal error: Uncaught DivisionByZeroError: Division by zero…
Jak już wiesz, operator dzielenia PHP wykonuje dzielenie zmiennoprzecinkowe, a funkcja intdiv()
odrzuca resztę z dzielenia i zwraca tylko część całkowitą wyniku. Ale czy wiesz, że w PHP istnieje analogiczny zestaw operatora i funkcji, który działa dokładnie odwrotnie? Składa się on z operatora dzielenia modulo (%
) i funkcji fmod()
.
Dzielenie modulo w PHP
Choć nazwa dzielenie modulo może nasuwać skojarzenie z czymś trudnym i skomplikowanym, w rzeczywistości kryje się za nią bardzo proste działanie arytmetyczne.
Polega ono na wykonaniu dzielenia całkowitego pierwszego argumentu przez drugi i zwróceniu tylko reszty z tej operacji. Operator dzielenia modulo PHP ma postać znaku procenta (%
), np.:
var_dump(10 % 3); // Wynik: int(1)
var_dump(37 % 14); // Wynik: int(9)
var_dump(-13 % 5); // Wynik: int(-3)
var_dump(13 % -5); // Wynik: int(3)
Zwróć uwagę na wyniki dwóch ostatnich przykładów, w których pokazałem dzielenie modulo z udziałem argumentów ujemnych. Wynik dzielenia modulo w PHP ma zawsze taki sam znak, jak dzielna, czyli pierwszy argument.
Operator dzielenia modulo PHP wykonuje całkowite dzielenie modulo, które polega na tym, że najpierw zostaje usunięta część ułamkowa argumentów, a dopiero po tym zostaje wykonana operacja, np.:
var_dump(7 % 3.5); // Wynik: int(1)
W tym przykładzie część ułamkowa wartości 3.5
zostanie odrzucona przed wykonaniem działania, więc w rzeczywistości zostanie wykonana operacja 7 % 3
. Stąd mamy 1 w wyniku.
Jeśli chcesz wykonać zmiennoprzecinkowe dzielenie modulo w PHP, to możesz użyć funkcji fmod()
, np.:
var_dump(fmod(10, 3.4)); // Wynik: float(3.2)
Skąd wziął się ten wynik? Aby to zrozumieć, najprościej jest dodawać do siebie liczbę 3,4 aż do osiągnięcia liczby większej od 10.
Zatem 3,4 + 3,4 = 6,8, więc idziemy dalej. 3,4 + 3,4 + 3,4 = 10,2, więc już wiemy, że liczba 3,4 w liczbie 10 w całości mieści się tylko dwa razy. W związku z tym bierzemy sumę dwóch liczb 3,4 i odejmujemy ją od liczby 10: 10 − 6,8 = 3,2.
Pamiętaj też o kwestii precyzji liczb zmiennoprzecinkowych w PHP. Jeśli o niej zapomnisz, wynik może cię zaskoczyć, np.:
var_dump(fmod(9.67, 3.14)); // Wynik: float(0.24999999999999956)
W tym przypadku spodziewaliśmy się wyniku 0,25, ponieważ 3,14 × 3 = 9,42; a 9,67 − 9,42 = 0,25. Jednak brak możliwości precyzyjnego reprezentowania niektórych liczb zmiennoprzecinkowych w pamięci komputera spowodował, że otrzymaliśmy tylko przybliżony wynik.
To tyle, jeśli chodzi o operatory arytmetyczne PHP. Choć jest parę niuansów, o których należy pamiętać podczas ich używania, w zdecydowanej większości przypadków używa się ich po prostu intuicyjnie.
Teraz przejdziemy do wspomnianych na początku operatorów inkrementacji i dekrementacji. Początkującego programistę mogą przerażać samą swoją nazwą. Sprawdźmy więc, czy naprawdę jest się czego bać.

Operatory inkrementacji i dekrementacji
Co to jest inkrementacja i dekrementacja w PHP? Pod tymi nazwami kryją się bardzo proste operacje — odpowiednio zwiększanie wartości o 1 i zmniejszanie wartości o 1 (więc już wiesz, że nie ma się czego bać).
Jaki jest symbol inkrementacji? Operatorem inkrementacji są dwa znaki plus (++
), które można umieścić przed nazwą zmiennej, jest to wtedy operator preinkrementacji, lub za nazwą zmiennej, i wtedy jest to operator postinkrementacji (za chwilę wyjaśnię, czym się różnią).
W każdym przypadku jest to operator jednoargumentowy. Może on być oddzielony od nazwy zmiennej spacjami, ale zwyczajowo (i zgodnie z zaleceniem standardu PSR-12: Extended Coding Style) umieszcza się go bezpośrednio obok niej, np.:
$a = 10;
$a++;
Po wykonaniu tych instrukcji zmienna $a będzie miała wartość 11
.
A jaki jest symbol dekrementacji? Jak być może się domyślasz, skoro dla inkrementacji zarezerwowano dwa plusy, to dla dekrementacji, która jest operacją przeciwną, zarezerwowano dwa minusy (ten operator również jest jednoargumentowy i występuje w dwóch wersjach — predekrementacji i postdekrementacji), np.:
$b = 10;
--$b;
Po wykonaniu tych instrukcji zmienna $b będzie miała wartość 9
.
Jaka jest więc różnica między wersjami z przedrostkiem pre- a wersjami z przedrostkiem post- w nazwie?
Przedrostek pre- oznacza przed, a post- oznacza po. Zatem różnica między tymi dwiema wersjami tych operatorów dotyczy momentu wykonania reprezentowanych przez nie operacji.
Operacja ta może zostać wykonana przed zwróceniem zmiennej (w przypadku wersji pre-) lub po jej zwróceniu (w przypadku wersji post-). W efekcie w bieżącym wyrażeniu otrzymamy odpowiednio wartość zmiennej zmienioną o 1 lub jeszcze niezmienioną. Najłatwiej to zrozumieć na konkretnym przykładzie:
$a = 10;
echo $a; // Wynik: 10
echo $a++; // Wynik: 10
echo $a; // Wynik: 11
Rozumiesz, dlaczego wyniki są takie? Użyty tu został operator postinkrementacji. Przeanalizujemy ten kod krok po kroku.
- W 1. wierszu utworzyliśmy zmienną o nazwie $a i nadaliśmy jej wartość
10
. - W 2. wierszu wyświetliliśmy wartość naszej zmiennej, która wynosi
10
. - W 3. wierszu najpierw wyświetliliśmy wartość zmiennej,
10
, a następnie zwiększyliśmy ją o 1 i zwróciliśmy tę zmienną. - W 4. wierszu znowu wyświetliliśmy wartość zmiennej $a, która teraz wynosi już
11
.
A teraz przeanalizujemy analogiczny przykład, z użyciem operatora preinkrementacji:
$a = 10;
echo $a; // Wynik: 10
echo ++$a; // Wynik: 11
echo $a; // Wynik: 11
Przyjrzyjmy się tym instrukcjom po kolei:
- W 1. wierszu utworzyliśmy zmienną o nazwie $a i nadaliśmy jej wartość
10
. - W 2. wierszu wyświetliliśmy wartość naszej zmiennej, która wynosi
10
. - W 3. wierszu najpierw zwiększyliśmy wartość zmiennej do
11
, a następnie ją wyświetliliśmy, po czym zwróciliśmy tę zmienną. - W 4. wierszu znowu wyświetliliśmy wartość zmiennej $a, która nadal wynosi
11
.
Operator dekrementacji działa w identyczny sposób, tylko zamiast zwiększać wartość zmiennej o jeden, zmniejsza ją o jeden.

To wszystko. Cała filozofia. Proste jak kawałek sznurka w kieszeni. Okazuje się, że jednak nie taki diabeł straszny, jak go malują. To znaczy, jak brzmi jego imię…
Na tym zakończymy rozdział o operatorach arytmetycznych, w którym poznałeś wszystkie operatory arytmetyczne PHP oraz operatory inkrementacji i dekrementacji PHP, a także dowiedziałeś się, że trudne słowa nie zawsze oznaczają trudne pojęcia.
Aby utrwalić wiadomości, koniecznie przeczytaj podsumowanie oraz odpowiedz na pytania kontrolne i wykonaj ćwiczenia.
W następnym rozdziale opowiem ci o operatorach porównań. Czy wiesz na przykład, jak sprawdzić w skrypcie, czy wartość zmiennej $a jest większa od wartości zmiennej $b? Jeśli nie, to wkrótce się dowiesz!
Podsumowanie

- W języku PHP jest 8 operatorów arytmetycznych: tożsamość (
+
jednoargumentowy), negacja (-
jednoargumentowy), dodawanie (+
dwuargumentowy), odejmowanie (-
dwuargumentowy), mnożenie (*
), dzielenie (/
), dzielenie modulo (%
) oraz potęgowanie (**
). - Ponadto w PHP są 4 operatory inkrementacji i dekrementacji: dwa operatory inkrementacji (
++
) i dwa operatory dekrementacji (--
). - Jeśli przynajmniej jeden z argumentów działania arytmetycznego jest typu
float
, to wynik też jest typufloat
. - W PHP można wykonywać działania arytmetyczne na liczbach i łańcuchach reprezentujących liczby.
- Do wykonywania dzielenia całkowitego służy funkcja PHP
intdiv()
. - Do wykonywania zmiennoprzecinkowego dzielenia modulo służy funkcja PHP
fmod()
. - Wynik dzielenia modulo w PHP ma zawsze taki sam znak, jak pierwszy argument tej operacji.
- Operator preinkrementacji najpierw zwiększa wartość zmiennej, a potem ją zwraca.
- Operator postinkrementacji najpierw zwraca wartość zmiennej, a potem ją zwiększa.
- Operator predekrementacji najpierw zmniejsza wartość zmiennej, a potem ją zwraca.
- Operator postdekrementacji najpierw zwraca wartość zmiennej, a potem ją zmniejsza.
Pytania
- Jakie operatory arytmetyczne są dostępne w PHP?
- Co to jest inkrementacja i dekrementacja? Jak wyglądają operatory tych operacji?
- Czym różni się preinkrementacja od postinkrementacji oraz predekrementacja od postdekrementacji?
- Jaki jest typ wyniku działania arytmetycznego, jeśli oba argumenty są typu int? O czym należy pamiętać w tym przypadku?
- Jaki jest wynik działania arytmetycznego, jeśli przynajmniej jeden z argumentów jest typu
float
? - Czy w PHP można wykonywać działania arytmetyczne na liczbach i łańcuchach?
- Jaka funkcja służy do wykonywania dzielenia całkowitego?
- Jaka funkcja służy do wykonywania zmiennoprzecinkowego dzielenia modulo?
- Jaki jest znak dzielenia modulo w PHP?
Ćwiczenia
Wykonaj za pomocą PHP następujące operacje. Wyniki zapisz w zmiennych i wyświetl je na stronie internetowej:
- 3,4 + 23
- 0,1 + 0,3
- Zdefiniuj zmienną o wartości 22, a następnie zwiększ jej wartość o 1.
- Oblicz resztę z dzielenia liczby 45 przez 7.
- Oblicz resztę z dzielenia liczby 78,12 przez 33,5.
- Zmniejsz wynik poprzedniego działania o 1.