Zmienne z dolarem, typy proste i złożone, stałe define i const, operatory arytmetyczne, porównania i logiczne, inkrementacja oraz rzutowanie typów w PHP 8, z gotowymi wynikami przykładów. Lekcja 12.2 kursu INF.03.
Zmienna to nazwa z dolarem na początku, pod którą skrypt trzyma wartość: liczbę, napis albo wiersz pobrany z bazy. Typu zmiennej się nie deklaruje, PHP nadaje go po wartości i zmienia w locie, gdy do tej samej zmiennej trafi coś innego. W części pisemnej wracają pytania z ramką („jaką wartość będzie miała zmienna po wykonaniu kodu", „co wypisze echo", „jaki wynik da 7 % 3", „który operator łączy napisy", „czym różni się == od ==="). W zadaniu praktycznym zmienne trzymają dane wpisane w formularz i wyniki zapytań do bazy, więc każdy skrypt z arkusza zaczyna się od kilku przypisań.
Zmienna: nazwa z dolarem
Nazwa zmiennej zaczyna się od znaku $, po nim stoi litera albo podkreślenie, a dalej litery, cyfry i podkreślenia. Spacja, dywiz, cyfra na początku i polskie znaki są niedozwolone. Wielkość liter ma znaczenie, więc $cena i $Cena to dwie różne zmienne, i to jedna z częstszych przyczyn pustego wyniku na ekranie. Wartość nadaje operator przypisania =: najpierw liczy się to, co stoi po prawej, a wynik ląduje w zmiennej po lewej.
<?php
$cena = 120;
$Cena = 45;
$cena = 'Klawiatura';
echo $cena;
echo PHP_EOL;
echo $Cena;
Trzecie przypisanie pokazuje typowanie dynamiczne: ta sama zmienna trzymała liczbę, a chwilę później napis, i PHP nie zgłasza błędu. Co naprawdę siedzi w zmiennej, sprawdza kilka wbudowanych funkcji.
var_dump($a)
wypisuje typ razem z wartością, narzędzie do szukania błędów
gettype($a)
zwraca samą nazwę typu jako napis
isset($a)
zwraca true, gdy zmienna istnieje i nie jest null
unset($a)
usuwa zmienną z pamięci
empty($a)
zwraca true, gdy wartość jest fałszem albo zmiennej nie ma
isset (CZY USTAWIONA) sprawdza istnienie, empty (CZY PUSTA) sprawdza wartość, i te dwie funkcje mylą się najczęściej: dla $a = 0 obie zwracają true, bo zmienna istnieje, a zero jest fałszem. Odwołanie do zmiennej, której nigdy nie ustawiono, kończy się ostrzeżeniem Undefined variable i pustym miejscem w tekście. Zasięg zmiennej wewnątrz funkcji opisuje lekcja o funkcjach, napisach i datach. Typy proste i złożone
Typ to rodzaj wartości, który decyduje, co wolno z nią zrobić: liczby się dodaje, napisy łączy, wartości logiczne sprawdza w warunku. PHP ma pięć typów prostych i dwa złożone.
Typ
Przykład przypisania
Co pokaże var_dump
int (całkowity)
$a = 42;
int(42)
float (zmiennoprzecinkowy)
$b = 19.99;
float(19.99)
string (łańcuch znaków)
$c = 'Mysz';
string(4) "Mysz"
bool (logiczny)
$d = true;
bool(true)
null (brak wartości)
$e = null;
NULL
array (tablica)
$f = [45, 120, 650];
array(3) z listą elementów
object (obiekt)
$g = new DateTime();
object(DateTime) z polami
Część ułamkową oddziela kropka, nie przecinek: 19,99 to błąd składni. Napis wolno zapisać w apostrofach albo w cudzysłowie, a różnicę między nimi opisuje lekcja o składni i osadzaniu PHP w HTML. Typ bool przyjmuje tylko true albo false, wielkość liter w tych słowach nie ma znaczenia. Wartość null znaczy „nic tu nie ma" i dostaje ją pole, którego zapytanie do bazy nie wypełniło. Typy złożone trzymają wiele wartości naraz. array (tablica) to ponumerowany albo nazwany zestaw wartości i ma własną lekcję o tablicach. object (obiekt) to dane razem z funkcjami, które na nich pracują, i w zadaniu praktycznym wychodzi tylko przy obiektowej wersji mysqli i przy datach. Pułapka: gettype zwraca dla liczby zmiennoprzecinkowej napis double, a nie float, choć sam typ nazywa się float.
Typowanie dynamiczne i słabe
PHP jest językiem o słabej kontroli typów: gdy operator dostanie wartość niewłaściwego rodzaju, sam ją przerabia, zamiast przerwać skrypt. Wynik zależy wtedy od operatora, a nie od tego, co było w zmiennej.
<?php
$x = "5" + 3;
$y = "5" . 3;
var_dump($x);
var_dump($y);
Ten sam napis "5" raz stał się liczbą, bo + dodaje, a raz został napisem, bo . łączy. Dlatego pytanie o wynik zawsze zaczyna się od rozpoznania operatora. Porównanie "abc" == 0 w PHP 8 daje false: napis nieliczbowy porównywany z liczbą każe zamienić na napis liczbę, a nie odwrotnie. W PHP 7 to samo porównanie dawało true i takie pytania siedzą jeszcze w bankach, więc w odpowiedziach bywają obie wersje.
Stałe
Stała to nazwa związana z wartością na cały czas działania skryptu: raz nadanej wartości nie da się zmienić ani usunąć. Nadaje się ją na dwa sposoby, a używa BEZ dolara.
<?php
define('VAT', 23);
const SKLEP = 'Komputronik';
$netto = 100;
echo SKLEP . ': brutto ' . ($netto * (1 + VAT / 100));
define (ZDEFINIUJ) bierze nazwę w apostrofach i wartość, więc wolno go postawić w dowolnym miejscu, także wewnątrz warunku. const (STAŁA) jest zapisem krótszym, ale musi stać w kodzie najwyższego poziomu albo w klasie. Nazwy stałych pisze się WIELKIMI literami, żeby odróżniały się od zmiennych. Stała napisana z dolarem przestaje być stałą i staje się zwykłą zmienną, co jest gotowym kształtem pytania z ramką.
Kilka stałych daje sam PHP. PHP_EOL to znak końca wiersza właściwy dla systemu, PHP_VERSION to numer wersji interpretera, M_PI to liczba pi, a PHP_INT_MAX to największa liczba całkowita, jaką da się zapisać.
Operatory
Operator to znak albo para znaków wykonujących działanie na jednej lub dwóch wartościach.
Operator
Znaczy
Przykład
Wynik
/
dzielenie, wynik bywa ułamkiem
10 / 4
2.5
%
reszta z dzielenia
7 % 3
1
.
łączenie napisów
'Cena: ' . 120
Cena: 120
Dzielenie zwraca int tylko przy dzieleniu bez reszty: 10 / 5 daje int(2), a 10 / 4 daje float(2.5). Sam iloraz całkowity zwraca intdiv (DZIELENIE CAŁKOWITE). Operator % liczy resztę, więc $n % 2 == 0 to standardowy test parzystości.
<?php
echo 7 % 3;
echo PHP_EOL;
echo 10 / 4;
echo PHP_EOL;
echo intdiv(10, 4);
Napisy łączy wyłącznie kropka. Dwa napisy dodane operatorem + zostają zamienione na liczby, więc "3" + "4" daje 7, a nie 34.
<?php
$x = "3" + "4";
echo $x;
echo PHP_EOL;
echo "3" . "4";
echo PHP_EOL;
echo 'Cena: ' . 120 . ' zł';
Przypisanie złożone skraca zapis, w którym zmienna zmienia własną wartość. $a += 5 znaczy $a = $a + 5, i tak samo działają -=, *=, /= oraz %=; dla napisów .= dokleja tekst na koniec. Przypisanie przez referencję $b = &$a nie kopiuje wartości, tylko wiąże obie nazwy z tym samym miejscem w pamięci, więc zmiana $b zmienia też $a.
<?php
$a = 10;
$a += 5;
$a *= 2;
$s = 'Cena: ';
$s .= $a;
echo $a;
echo PHP_EOL;
echo $s;
Inkrementacja zwiększa zmienną o jeden i ma dwie postacie. ++$a (preinkrementacja) najpierw zwiększa, a potem oddaje nową wartość do wyrażenia. $a++ (postinkrementacja) najpierw oddaje STARĄ wartość, a dopiero potem zwiększa zmienną. Sam zapis $a++ w osobnym wierszu jest równoważny $a = $a + 1, różnicę widać dopiero w środku wyrażenia. Dekrementacja --$a i $a-- działa tak samo, tylko odejmuje.
<?php
$a = 5;
$b = $a++ + ++$a;
echo $a;
echo PHP_EOL;
echo $b;
Rachunek idzie krok po kroku. $a++ oddaje do sumy 5 i ustawia $a na 6. ++$a ustawia $a na 7 i oddaje do sumy 7. Suma to 5 plus 7, czyli 12, a $a zostaje z wartością 7.
Operator
Znaczy
Przykład
Wynik
==
równe co do wartości
1 == '1'
true
===
równe co do wartości I typu
1 === '1'
false
!=
różne co do wartości
1 != 2
true
!==
różne co do wartości albo typu
1 !== '1'
true
>=
większe albo równe
5 >= 5
true
<=>
porównanie trójstronne
2 <=> 5
-1
Operator <=> zwraca -1, 0 albo 1, zależnie od tego, czy lewa wartość jest mniejsza, równa czy większa od prawej.
Operator
Znaczy
Przykład
Wynik
&&
iloczyn logiczny, koniunkcja
true && false
false
||
suma logiczna, alternatywa
true || false
true
xor
alternatywa wykluczająca
true xor true
false
and
to samo co &&, niższy priorytet
true and false
false
or
to samo co ||, niższy priorytet
true or false
true
Różnica między && a and nie leży w wyniku, tylko w priorytecie. && wiąże mocniej niż przypisanie, and słabiej, więc $x = true && false; wpisuje do $x wartość false, a $x = true and false; wpisuje true, bo przypisanie wykonuje się przed and; w warunkach używa się więc && i ||. Warunek na przedział to dwa porównania złączone koniunkcją: $x >= -5 && $x < 10.
Priorytet reszty operatorów jest ten sam co w matematyce: potęgowanie przed mnożeniem i dzieleniem, te przed dodawaniem, a nawias zmienia kolejność. Wyrażenie 2 + 3 * 4 daje 14, a (2 + 3) * 4 daje 20.
Operator trójargumentowy skraca instrukcję warunkową do jednego wiersza: $opis = $stan > 0 ? 'dostepny' : 'brak'; bierze pierwszą wartość przy prawdzie, drugą przy fałszu. Operator ?? (scalanie z null) oddaje lewą stronę, gdy ta istnieje i nie jest null, a inaczej prawą, więc $imie = $_POST['imie'] ?? 'gosc'; nie wywoła ostrzeżenia przy pustym formularzu.
Konwersje typów
Konwersja to zamiana wartości na inny typ. Rzutowanie zapisuje się nazwą typu w nawiasie przed wartością i nie zmienia samej zmiennej, tylko wynik wyrażenia.
Rzutowanie na int obcina część ułamkową, nie zaokrągla, więc (int)12.9 to 12, a nie 13. Napis zamieniany na liczbę czyta się od początku do pierwszego znaku, który liczbą nie jest: "12abc" daje 12, a "abc" daje 0. To samo robi funkcja intval (WARTOŚĆ CAŁKOWITA). Funkcja settype($zm, 'integer') różni się od niej tym, że przerabia SAMĄ zmienną i zwraca true albo false, a nie przerobioną wartość.
Fałszem w PHP jest siedem wartości: false, 0, 0.0, napis pusty "", napis "0", null oraz pusta tablica. Wszystko inne jest prawdą, także napis "0.0", napis ze spacją " " oraz liczba ujemna -1.
Dane z formularza przychodzą do skryptu ZAWSZE jako napisy, nawet z pola type="number". Napis "3" da się dodać bez rzutowania, ale przed wstawieniem do zapytania SQL rzutuje się go jawnie, żeby do bazy nie poszła litera. Odbieranie i sprawdzanie danych opisuje lekcja o formularzach GET i POST. <?php
$ilosc = "3";
$cena = 45;
$suma = (int) $ilosc * $cena;
var_dump($suma);
Na egzaminie
Pytania pisemne mają kilka stałych kształtów. Pierwszy to ramka z kodem i pytanie o wartość zmiennej po wykonaniu instrukcji: liczy się ją wiersz po wierszu, zapisując wynik każdego przypisania. Taką ramkę można w przeglądarce przeklikać instrukcja po instrukcji w interpreterze PHP i porównać z własnym rachunkiem. Drugi to nazwa operatora: resztę z dzielenia daje %, sumę logiczną ||, iloczyn logiczny &&, a // to początek komentarza jednoliniowego, nie dzielenie. Trzeci to typ: typem logicznym jest bool (w odpowiedziach Boolean), float to typ zmiennoprzecinkowy, a wartość zmiennoprzecinkową dla $a = 5 i $b = 3 zwraca $a / $b, bo dodawanie i mnożenie liczb całkowitych dają całkowitą. Czwarty to porównanie: $a === $b przy $a = 1 jest prawdą wyłącznie dla $b równego 1 bez apostrofów, bo '1' to napis. Piąty to funkcja wbudowana: settype konwertuje zmienną do wskazanego typu, empty($a) dla $a = 0 zwraca true, a define('OSOBA', 'Kowalski') definiuje stałą, nie zmienną. Kilka odpowiedzi myli się regularnie. % to reszta, nie iloraz: 7 % 3 daje 1, a nie 2. . łączy napisy, + dodaje liczby, więc "3" + "4" daje 7, a "3" . "4" daje 34. == porównuje same wartości, === wartości razem z typem, a = to przypisanie i w warunku zawsze da prawdę. Wartości z $_POST są napisami, choć wyglądają jak liczby.
Pułapka: $a++ użyte w środku wyrażenia oddaje STARĄ wartość, a zwiększa zmienną dopiero potem. Dla $a = 5 wyrażenie $a++ + ++$a daje 12, a $a kończy z wartością 7.
W zadaniu praktycznym zmienne trzymają wartości z pól formularza, identyfikator połączenia z bazą i kolejne wiersze wyniku zapytania. Kwota albo ilość z formularza wymaga rzutowania na int przed policzeniem sumy i przed wstawieniem do klauzuli WHERE, bo bez tego do zapytania trafi napis.
Ściąga
$cena = 120;
przypisanie, $Cena to inna zmienna
var_dump($a)
wypisuje typ razem z wartością
isset($a)
zmienna istnieje i nie jest null
empty($a)
wartość jest fałszem, także dla 0
define('VAT', 23);
stała, używana bez dolara
7 % 3
reszta z dzielenia, wynik 1
10 / 4
dzielenie, wynik 2.5 jako float
intdiv(10, 4)
iloraz całkowity, wynik 2
'Cena: ' . 120
łączenie napisów, wynik Cena: 120
$a += 5
to samo co $a = $a + 5
$a++
oddaje starą wartość, potem zwiększa
1 === '1'
false, bo === sprawdza także typ
(int)"12abc"
rzutowanie na całkowitą, wynik 12
(bool)"0"
false, jak 0, "", null i pusta tablica
Pobierz ściągę PDF