← Lekcje
PHP · lekcja 03

Obliczenia w PHP: operatory

Jak PHP liczy, porównuje i skleja?

  1. Działania na liczbach: + - * / % ** i kolejność działań
  2. Skróty: +=, .=, licznik ++
  3. Porównania i logika: == kontra ===, &&, ||, !
  4. Ćwiczenie: kalkulator i BMI w calculator.php
Rozgrzewka · 3 minuty

Rozgrzewka: tablice

$fruits = ["jabłko", "gruszka", "śliwka"];
  1. Co wypisze echo $fruits[1];?
  2. Co wypisze echo count($fruits);?
  3. Jaką instrukcją wypiszecie wszystkie owoce, po jednym w linii?
Operatory · arytmetyczne

Sześć działań na liczbach

Operator to znak działania między dwiema wartościami. Tabela pokazuje sześć operatorów arytmetycznych: cztery znacie z matematyki, dwa ostatnie wyglądają inaczej niż na kartce.

ZapisNazwaPrzykładWynik
$a + $bdodawanie17 + 522
$a - $bodejmowanie17 - 512
$a * $bmnożenie17 * 585
$a / $bdzielenie7 / 23.5 (float)
$a % $breszta z dzielenia (modulo)17 % 52
$a ** $bpotęgowanie2 ** 101024

Dzielenie / daje float (liczbę z przecinkiem). Wyjątek: gdy obie liczby są całkowite i dzielą się bez reszty, wynik jest int: 6 / 2 to int(3).

PHP Manual: Arithmetic Operators · php.net/manual/en/language.operators.arithmetic.php
Operatory · % i dzielenie

Reszta z dzielenia: czy parzyste?

echo 10 % 2;   // 0  → parzysta
echo 7 % 2;    // 1  → nieparzysta
echo 17 % 5;   // 2  (17 = 3·5 + 2)

echo 7 / 2;           // 3.5
echo intdiv(7, 2);   // 3  (bez reszty)

Liczba jest parzysta, gdy reszta z dzielenia przez 2 wynosi 0. Tak samo sprawdzicie, czy liczba dzieli się przez 4 albo czy wiersz tabeli jest co drugi ($row % 2, wraca na lekcji o pętlach).

intdiv to dzielenie całkowite: ile pełnych razy 2 mieści się w 7. Reszta i dzielenie całkowite to para: intdiv(7, 2) daje 3, 7 % 2 daje 1.

Przez zero dzielić nie wolno. 7 / 0, 7 % 0 i intdiv(7, 0) przerywają skrypt błędem DivisionByZeroError. Zanim podzielicie przez zmienną, sprawdzacie, czy nie jest zerem.

PHP Manual: Arithmetic Operators · php.net/manual/en/language.operators.arithmetic.php · intdiv · php.net/manual/en/function.intdiv.php · DivisionByZeroError · php.net/manual/en/class.divisionbyzeroerror.php
Operatory · kolejność

Kolejność działań i nawiasy

najpierw na końcu ( ) ** * / % + - . < == === && || nawiaspotęgamnożenie, dzieleniedodawaniesklejanieporównanialogika
echo 2 + 3 * 4;          // 14   (najpierw 3 * 4)
echo (2 + 3) * 4;        // 20   (nawias wygrywa)
echo "Wynik: " . 2 + 3;  // Wynik: 5   (kropka jest słabsza od plusa)

Jak w matematyce: mnożenie przed dodawaniem. Gdy nie jesteście pewni, dajecie nawias. Nawias nic nie kosztuje, a błąd w kolejności kosztuje godzinę szukania.

PHP Manual: Operator Precedence · php.net/manual/en/language.operators.precedence.php (od PHP 8 kropka słabsza od + i -)
Operatory · przypisania

Skróty: +=, .= i licznik ++

$total = 3;
$total += 5;      // $total = $total + 5
echo $total;      // 8

$text = "Suma: ";
$text .= 22;      // dokleja na koniec
echo $text;       // Suma: 22
$count = 0;
$count++;         // $count = $count + 1
$count++;
echo $count;      // 2

$count--;         // o jeden w dół
echo $count;      // 1

= nie znaczy „równa się”, tylko „zmienna dostaje wartość z prawej”. += bierze starą wartość, dodaje i zapisuje z powrotem (są też -=, *=, /=). ++ przydaje się do liczników, na przykład kliknięć czy odwiedzin.

PHP Manual: Assignment Operators · php.net/manual/en/language.operators.assignment.php · String Operators · language.operators.string.php · Incrementing/Decrementing Operators · language.operators.increment.php
Operatory · porównania

Porównania: == kontra ===

"5" == 5 "5" 5 true: waży tylko wartość "5" === 5 "5" string 5 int false: waży wartość i typ
ZapisPrawda, gdy…PrzykładWynik
== / !=wartości równe / różne (typ nieważny)"5" == 5true
=== / !==równe wartość i typ / różne"5" === 5false
< > <= >=mniejsze, większe, mniejsze lub równe…5 >= 5true

Dane z formularza przychodzą zawsze jako tekst, dlatego "5" i 5 spotykają się w kodzie ciągle. Piszemy ===: mniej niespodzianek.

Ciekawostka z PHP Manual: od PHP 7.0 istnieje operator <=> („spaceship operator”), który łączy trzy porównania w jednym znaku i zwraca liczbę ujemną, zero albo dodatnią.

PHP Manual: Comparison Operators · php.net/manual/en/language.operators.comparison.php · ciekawostka: PHP Manual, Migrating from PHP 5.6.x to PHP 7.0.x · php.net/manual/en/migration70.new-features.php
Operatory · logiczne

Logika: &&, ||, !

AB A && BA || B!A true true true true false true false false true false false true false true true false false false false true
  • && „i”: prawda, gdy oba warunki prawdziwe. Kredyt: 18 lat i dochód.
  • || „lub”: prawda, gdy choć jeden. Wejście: bilet lub pracownik.
  • ! „nie”: odwraca. !$isAdult to „niepełnoletni”.
$age = 20; $hasTicket = false;
$age >= 18 && $hasTicket   // false
$age >= 18 || $hasTicket   // true

Wynik to zawsze true albo false. Na następnej lekcji trafi do if: „jeśli warunek, to zrób”.

PHP Manual: Logical Operators · php.net/manual/en/language.operators.logical.php
Egzamin INF.03

Tak pytają na egzaminie

1. W języku PHP, dla zmiennych a = 5 i b = 3 wartość typu zmiennoprzecinkowego zwróci wyrażenie

  1. a + b
  2. a * b
  3. a / b
  4. a && b

2. W języku PHP sumę logiczną oznacza operator

  1. !
  2. ||
  3. +
  4. &&

„Suma logiczna” to matematyczna nazwa „lub”, „iloczyn logiczny” to „i”. Na egzaminie te nazwy padają zamiast znaków.

CKE, E.14 styczeń 2018, zad. 26 · CKE, E.14 styczeń 2019, zad. 35 (bank pytań, przedmiot strony, temat php)
Ćwiczenie przy komputerze · 10 minut

Ćwiczenie 1: calculator.php

  1. W swoim folderze na serwerze utwórz plik calculator.php. Wpisz dwie zmienne: $a = 17; i $b = 5;
  2. Wypisz pięć linii (między nimi <br>): sumę, różnicę, iloczyn, iloraz zaokrąglony do 2 miejsc funkcją round($a / $b, 2) i resztę z dzielenia.
  3. Pod spodem dopisz $height = 1.80; $weight = 75; i policz BMI: waga podzielona przez wzrost do kwadratu, też round(..., 2).
  4. Otwórz localhost/calculator.php. Gdy działa, zostaw plik w folderze kursu.

Ma się pojawić: Suma: 22, Różnica: 12, Iloczyn: 85, Iloraz: 3.4, Reszta: 2, a niżej BMI: 23.15.

Dla szybkich: zmień $b na 0 i przeczytaj komunikat błędu. Potem wróć do 5.

PHP Manual, php.net/manual/en/function.round.php
Ćwiczenie na kartce · 5 minut

Ćwiczenie 2: co wypisze?

Bez komputera. Zapisz wynik każdej linii, potem sprawdź uruchamiając kod.

echo 17 % 5;                    // 1.

Co wypisze ten kod?

echo 2 + 3 * 4;                 // 2.

Co wypisze ten kod?

echo "Wynik: " . 2 + 3;         // 3.

Co wypisze ten kod?

var_dump("5" === 5);           // 4.

Co wypisze ten kod?

$i = 5; $i++; $i += 10; echo $i;   // 5.

Co wypisze ten kod?

Pułapki są w linii 3 i 4. Kto ma 5 na 5, tłumaczy linię 3 sąsiadowi.

Na koniec

Sprawdź się

  1. Jak jednym działaniem sprawdzić, czy liczba jest parzysta?
  2. Dlaczego "5" == 5 daje true, a "5" === 5 daje false?
  3. Co wypisze echo 10 - 2 * 3;, a co echo (10 - 2) * 3;?

Następna lekcja: instrukcja warunkowa if. Wyniki porównań z dzisiaj staną się warunkami.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Cena jako float: 49.99 * 3Pieniądze trzyma się w groszach jako int (4999 * 3). Float traci końcówki: floor((0.1 + 0.7) * 10) daje 7, nie 8. Na fakturze grosz się nie zgadza.float do pieniędzy: unikane
round($x, 2) do pokazanianumber_format($total, 2, ',', ' ') wypisze 1 234,50: przecinek i odstęp tysięcy po polsku.nadal w użyciu
== i === obok siebieW zespole obowiązuje ===. Narzędzia sprawdzające kod (PHPStan, PHP-CS-Fixer) zgłaszają każde == przed połączeniem zmian.==: unikane
Dzielenie bez sprawdzeniaŚrednia z zera zamówień to DivisionByZeroError i strona 500 u klienta. Dzielnik sprawdza się przed dzieleniem.nadal w użyciu
Licznik $i++Tablice obchodzi się pętlą foreach; ++ zostaje w licznikach (odsłony, próby logowania).nadal w użyciu
PHP Manual: Floating point numbers · php.net/manual/en/language.types.float.php (przykład 0.1 + 0.7) · number_format · php.net/manual/en/function.number-format.php
← → slajdy · F pełny ekran · S spis