Operatory
Ostatnia modyfikacja: 01.06.2021
Jak sama nazwa mówi, służą one do wykonywania jakichś operacji na przykład na zmiennych, liczbach czy stringach.
Ogólnie operatorów jest sporo, listę znajdziemy w dokumentacji, więc nie będziemy omawiać wszystkich. Pokażę te podstawowe i moim zdaniem najważniejsze dla Ciebie w tym momencie.
Operatory arytmetyczne
Są to podstawowe operacje matematyczne, które zapewne każdy z nas zna.
-
+
dodawanie<?php echo 1 + 2; // result: 3
<?php $motherAge = 42; $dadAge = 39; $familyAge = $motherAge + $dadAge; echo $familyAge; // result: 81
-
-
odejmowanie<?php $money = 10; echo $money - 2.99; // result: 7.01
-
*
mnożenie<?php $sideA = 6; $sideB = 3; $rectangleArea = $sideA * $sideB; echo $rectangleArea; // result: 18
Czy wspomniałem już, że również jak w matematyce obowiązuje nas kolejność działań oraz że możemy użyć nawiasów do jej określenia?
<?php echo 5 * 4 - 3; // result: 17 echo 5 * (4 - 3); // result: 5
-
/
dzielenie<?php $candies = 16; $people = 4; echo $candies / $people; // result: 4
Uwaga - nie dziel przez zero!
Jak (mam nadzieję) pamiętasz, nie wolno dzielić przez 0 - ta sama zasada obowiązuje w programowaniu:
<?php echo 4 / 0; // result: warning - division by zero
-
%
modulo - reszta z dzielenia<?php $number = 10 % 3; echo $number; // result: 1
-
**
potęgowanie php >=5.6<?php echo 4 ** 2; // result: 16
Operatory przypisania
Podstawowym operatorem w tej grupie będzie z pewnością już wielokrotnie wcześniej używany znak =
.
<?php
$year = 2017;
echo $year; // result: 2017
Możemy też użyć go kilka razy w jednym zapisie. W takiej sytuacji przypisanie będzie następowało w kolejności od prawej strony.
<?php
$name = $user = 'Jan';
echo $name; // result: Jan
echo $user; // result: Jan
Co więcej, możemy też połączyć go z wybranym operatorem arytmetycznym, aby od razu wykonać określoną operację i przypisać efekt jej wykonania. Jak to działa w praktyce?
<?php
$day = 20;
$day += 7;
echo $day; // result: 27
<?php
$price = 2.99;
echo $price -= 0.39; // result: 2.6
<?php
$candies = 10;
$people = 3;
$candies *= $people;
echo $candies; // result: 30
<?php
$apples = 40;
echo $apples /= 5; // result: 8
<?php
$users = 10;
echo $users %= 4; // result: 2
<?php
$number = 3;
echo $number **= 3; // result: 27
Uwaga - niezadeklarowane zmienne
Pamiętaj, że jeśli chcesz użyć przypisania z wykonaniem operacji, zmienna musi być wcześniej zadeklarowana. W przeciwnym wypadku otrzymasz ostrzeżenie o użyciu niezadeklarowanej zmiennej.
<?php
$day += 7; // notice - undefined variable 7
echo $day;
Operatory ciągu
Tutaj podstawowym operatorem jest znak kropki. Umożliwia on łączenie kilku ciągów w jeden. Nazywamy to konkatenacją.
<?php
$logo1 = 'PHP';
$logo2 = 'Devs';
echo $logo1 . $logo2; // result: PHPDevs
Uwaga na przyzwyczajenia
W większości języków programowania konkatenację wykonuje się przy użyciu znaku dodawania +
. Należy jednak pamiętać, że w PHP służy do tego .
, a próba połączenia dwóch stringów plusem zakończy się błędem. W sytuacji, gdy piszesz już w innych językach, może się to mylić ;)
Tak jak wyżej, tu też możemy wykonać łączenie ciągów od razu z przypisaniem. Będzie to wyglądało tak:
<?php
$logo = 'PHP';
$logo .= 'Devs';
echo $logo; // result: PHPDevs
Operatory inkrementacji i dekrementacji
Jest to odpowiednio zwiększenie ++
i zmniejszenie --
o jeden danej wartości. Wyróżniamy preinkrementację i postinkrementację (podobnie z resztą z dekrementacją). Czym się różnią? Preinkrementacja najpierw zwiększa wartość o jeden i zwraca już powiększoną wartość, a postinkrementacja zwraca aktualną i dopiero powiększa wartość. Identycznie jest z dekrementacją (predekrementacja i postdekrementacja), z tym że wartość jest zmniejszana.
Jeśli jeszcze niezbyt zrozumiałeś, to spójrz na poniższe przykłady i wszystko stanie się jasne.
<?php
$count = 0;
echo $count++; // result: 0
echo $count; // result: 1
<?php
$count = 0;
echo ++$count; // result: 1
<?php
$count = 10;
echo $count--; // result: 10
echo --$count; // result: 8
Operatory porównania
Często spotkasz na swojej drodze sytuacje, gdy będzie trzeba coś porównać - na przykład dwa ciągi tekstowe, czy dwie liczby. Szczególnie często porównania spotkasz przy instrukcjach warunkowych (które już niedługo pojawią się w kursie). Zobaczmy, jakie mamy do dyspozycji operatory do tego celu.
-
==
takie same<?php var_dump(4 == 4); // result: bool(true) var_dump(4 == 2); // result: bool(false) var_dump('PHP' == 'PHPDevs'); // result: bool(false)
-
===
takie same ze sprawdzeniem typu<?php var_dump(4 === 4); // result: bool(true) var_dump(4 === 2); // result: bool(false)
Uwaga na typy przy porównaniach
Na pierwszy rzut oka wydaje się więc, że pomiędzy
==
i===
nie ma różnicy. Jednak jest, bardzo istotna i często mylona. Przy użyciu potrójnego znaku równości sprawdzany jest także typ wartości (czy wartości są tego samego typu, na przykład string, int czy innego). Zobacz różnicę w praktyce:<?php var_dump(4 == '4'); // result: bool(true) var_dump(4 === '4'); // result: bool(false) var_dump(4 === 4); // result: bool(true)
Więcej przykładów - tabela porównań.
Ze swojej strony zalecam, aby używać zawsze sprawdzania z typem
===
, a przynajmniej robić to domyślnie - sprawdzanie bez typu dopuszczać tylko świadomie, jeśli to konieczne. W przypadku przedstawionym powyżej nie ma to większego znaczenia, ale ogólnie pozwoli uniknąć niespodziewanych błędów w przyszłości. Szczególnie widoczne to może być np. przy pracy z wartościami 0 i false (czy odpowiednio 1 i true).0 == false
jest prawdziwe, a0 === false
już nie (int i bool to inne typy). To może być problematyczne w różnych sytuacjach.Jeśli jesteś ciekawy w jakich, to śpieszę z przykładem: chociażby funkcja
strpos()
, która zwraca pozycję wystąpienia danego znaku w ciągu znaków. W informatyce najczęściej liczymy od zera i tak też jest tutaj. Może się więc zdarzyć tak, że funkcja poda informację o znaku na pozycji 0, czyli pierwszym. Jednocześnie funkcja ta zwraca false, gdy dany znak nie występuje w ciągu. Już rozumiesz? Jeśli tego nie odróżnimy, to funkcja zwróci przykładowo, że znak jest na pozycji 0, a Ty pomyślisz, że wcale nie występuje, bo porównanie przez==
okaże się prawdziwe. -
!=
różne<?php var_dump(4 != 4); // result: bool(false) var_dump(4 != 2); // result: bool(true) var_dump('PHP' != 'PHPDevs'); // result: bool(true)
-
!==
różne ze sprawdzaniem typu (występuje taka sama różnica jak przy==
i===
)<?php var_dump(4 !== 4); // result: bool(false) var_dump(4 !== '4'); // result: bool(true) var_dump(4 !== 2); // result: bool(true)
Ciekawostka
Istnieje też operator
<>
, który jest równoznaczny z!=
, czyli porównuje bez zwracania uwagi na typ. Jednak wszędzie spotyka się raczej zapis!=
/!==
, ale warto wiedzieć w razie czego. -
>
większe<?php var_dump(4 > 7); // result: bool(false) var_dump(4 > 4); // result: bool(false) var_dump(4 > 2); // result: bool(true)
-
>=
większe lub równe<?php var_dump(4 >= 7); // result: bool(false) var_dump(4 >= 4); // result: bool(true) var_dump(4 >= 2); // result: bool(true)
-
<
mniejsze<?php var_dump(4 < 7); // result: bool(true) var_dump(4 < 4); // result: bool(false) var_dump(4 < 2); // result: bool(false)
-
<=
mniejsze lub równe<?php var_dump(4 <= 7); // result: bool(true) var_dump(4 <= 4); // result: bool(true) var_dump(4 <= 2); // result: bool(false)
-
<=>
porównuje dwie wartości i zwraca 0, gdy są równe, -1 gdy lewa jest mniejsza od prawej, a 1 gdy prawa jest mniejsza od lewej php >=7<?php var_dump(4 <=> 4); // result: int(0) var_dump(4 <=> 7); // result: int(-1) var_dump(4 <=> 2); // result: int(1)
Operator wykonania
Umożliwia wykonanie poleceń powłoki. W przypadku systemów Linux domyślną powłoką jest bash, tak więc to w nim wykonywane będą podane polecenia.
<?php
echo `pwd`;
Zwróć uwagę, że nie jest to zwykły, a tak zwany odwrotny apostrof `. Jeśli znasz chociaż podstawowe polecenia w Linuxie, to pewnie wiesz już, że na ekranie zostanie wyświetlona ścieżka do aktualnego katalogu (to zwraca pwd).
Operator kontroli błędów
Poprzez zapisanie znaku @
przed danymi poleceniami, możemy ukryć ewentualne błędy, co jest bardzo złą praktyką. W momencie, gdy coś się źle dzieje, chcielibyśmy jako programiści o tym wiedzieć, a nie ukryć pomocny nam komunikat, prawda? Widząc treść błędu znacznie łatwiej naprawić problem. Natrafiłem na bardzo wiele sytuacji, gdy ktoś szuka błędu i go nie widzi, a w kodzie używa tego operatora, czyli niestety interpreter nie poinformuje go o problemie.
<?php
echo @$name; // not showing error: "Undefined variable $name"
Używanie @
jest, jak wspomniałem, złą praktyką i nie należy tego robić. Mówię o tym właśnie dlatego, abyś wiedział, do czego to służy i co powoduje. Stanowczo odradzam stosowanie tego operatora w swoim kodzie, jeśli naprawdę nie jesteś pewien, że jest tam niezbędny. Istnieją znacznie lepsze sposoby nad kontrolą wyświetlania błędów, na przykład ustawienie display_errors w php.ini
, czy to indywidualnie w danym pliku, czy globalnie, co było omawiane podczas przygotowania środowiska.
Są jeszcze chociażby operatory bitowe czy logiczne. O nich może jednak kiedy indziej. Wątpię, aby były dla Ciebie teraz przydatne. Nie chciałbym na raz omawiać aż tylu zagadnień. Ta lekcja już i tak jest wyjątkowo długa i zawiera dużo wiedzy, ale mam nadzieję, że większość jest prosta i jasna, bo sporo tu wynika z podstawowej matematyki.
Komentarze