PHP 8 i 8.1 - sprawdź co nowego!

Podstawy języka > Lekcja 4

Operatory

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, a 0 === 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.

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze