- Hesab, mənimsətmə və məntiq operatorlarından,
??və??=-dən istifadə etmək ==ilə===arasındakı fərqi və tiplərin avtomatik çevrilməsini izah etməkif/elseif/else,match,forvəwhileilə proqramın axınını idarə etmək
Onlayn mağaza səbətdəki məbləğ 50 manatı keçəndə endirim verir, jurnal balı qiymətə çevirir, bank isə əmanət hədəfə çatana qədər faizləri hesablayır. Bütün bunlar üçün proqram hesablamalı, müqayisə etməli və qərar verməlidir. Bu dərsdə PHP-nin operatorları, şərtləri və dövrləri ilə tanış olacaqsan.
Hesab və mənimsətmə
<?php
$a = 17;
$b = 5;
echo $a + $b, "\n";
echo $a - $b, "\n";
echo $a * $b, "\n";
echo $a / $b, "\n";
echo $a % $b, "\n";
echo $a ** 2, "\n";
echo intdiv($a, $b), "\n";
var_dump(10 / 5);
$score = 10;
$score += 5;
$score *= 2;
$score++;
echo $score, "\n";22 12 85 3.4 2 289 3 int(2) 31
/həmişə dəqiq bölür:17 / 5nəticəsi3.4-dür. Tam bölünəndə isə nəticəintolur:10 / 5→int(2). Qalıqsız tam hissə üçünintdivişlət.%bölmədən qalığı,**isə qüvvətə yüksəltməni verir.+=,-=,*=,.=qısa mənimsətmə operatorlarıdır;$score++qiyməti 1 artırır.
Müqayisə: == və ===
PHP lazım olanda tipləri özü çevirir — buna tiplərin avtomatik çevrilməsi (type juggling) deyilir. Məsələn, "5" + 3 nəticədə 8 verir. == operatoru qiymətləri tipləri çevirdikdən sonra müqayisə edir, === isə həm qiyməti, həm də tipi yoxlayır. Uyğun olaraq != və !== də var. <=> («kosmik gəmi») operatoru sol tərəf kiçikdirsə -1, bərabərdirsə 0, böyükdürsə 1 qaytarır.
<?php
var_dump(5 == "5");
var_dump(5 === "5");
var_dump(0 == "");
var_dump(null == false);
var_dump("1" == "01");
var_dump("abc" == 0);
var_dump(3 <=> 7);bool(true) bool(false) bool(false) bool(true) bool(true) bool(false) int(-1)
$text = "PHP is fun";
if (strpos($text, "PHP") == false) {
echo "Not found"; // printed by mistake!
}$text = "PHP is fun";
if (!str_contains($text, "PHP")) {
echo "Not found";
}strpos sözü 0-cı mövqedə tapır və 0 qaytarır, 0 == false isə doğrudur. Ya === false yaz, ya da PHP 8-in str_contains funksiyasından istifadə et.Məntiq operatorları və ??
&& (və), || (və ya) və ! (inkar) şərtləri birləşdirir. Şərtdə false, 0, 0.0, "", "0", boş massiv [] və null yalan sayılır, qalan hər şey doğrudur. Null birləşdirmə operatoru ?? sol tərəf mövcuddursa və null deyilsə, onu, əks halda sağ tərəfi qaytarır. ??= isə dəyişənə yalnız o null-dursa qiymət verir.
<?php
$age = 16;
$hasTicket = true;
echo ($age >= 16 && $hasTicket) ? "Welcome!\n" : "Sorry\n";
$nickname = null;
echo $nickname ?? "Guest", "\n";
$lang = null;
$lang ??= "az";
echo $lang, "\n";
var_dump((bool) "0");
var_dump((bool) "0.0");Welcome! Guest az bool(false) bool(true)
if, elseif və match
<?php
$total = 72.5;
if ($total >= 100) {
$discount = 15;
} elseif ($total >= 50) {
$discount = 10;
} else {
$discount = 0;
}
$toPay = $total - $total * $discount / 100;
echo "Discount: $discount%\n";
echo "To pay: " . number_format($toPay, 2) . " AZN\n";Discount: 10% To pay: 65.25 AZN
PHP 8-dəki **match** ifadəsi bir qiyməti bir neçə variantla müqayisə edib nəticə qaytarır. O, switch-dən fərqli olaraq === ilə sərt müqayisə aparır, break tələb etmir və bir qolda bir neçə qiymət qəbul edir. Heç bir qol uyğun gəlməsə və default olmasa, UnhandledMatchError xətası yaranır.
<?php
$day = 6;
$type = match ($day) {
1, 2, 3, 4, 5 => "weekday",
6, 7 => "weekend",
default => "unknown",
};
echo "Day $day is a $type\n";
$score = 83;
$grade = match (true) {
$score >= 90 => "A",
$score >= 80 => "B",
$score >= 70 => "C",
default => "F",
};
echo "Score $score gives $grade\n";Day 6 is a weekend Score 83 gives B
switch ($status) {
case 'new':
$label = 'New order';
break;
case 'paid':
$label = 'Paid';
break;
default:
$label = 'Unknown';
}$label = match ($status) {
'new' => 'New order',
'paid' => 'Paid',
default => 'Unknown',
};match qısadır, break-i unutmaq riski yoxdur və nəticəni birbaşa dəyişənə yazır.Dövrlər: for və while
for dövrü addımların sayı əvvəlcədən məlum olanda rahatdır, while isə şərt doğru olduqca təkrarlanır. continue cari addımı buraxıb növbətinə keçir, break isə dövrü tamamilə dayandırır. Aşağıdakı nümunədə əmanət ayda 10 % artır və biz onun 150 manata çatmasının neçə ay çəkdiyini hesablayırıq.
<?php
for ($i = 1; $i <= 5; $i++) {
if ($i === 3) {
continue;
}
echo "Step $i\n";
}
$balance = 100;
$months = 0;
while ($balance < 150) {
$balance *= 1.1;
$months++;
}
echo "Months: $months\n";
echo "Balance: " . round($balance, 2) . "\n";Step 1 Step 2 Step 4 Step 5 Months: 5 Balance: 161.05
Əsas fikirlər
/dəqiq bölür,%qalığı,**qüvvəti,intdivisə tam hissəni verir.==tipləri çevirib müqayisə edir,===isə tipi də yoxlayır — defolt olaraq===yaz.??mövcud olmayan və yanullqiymət üçün defolt verir,??=isə yalnız boş dəyişənə yazır.matchsərt müqayisə edir, qiymət qaytarır vəbreaktələb etmir;match (true)aralıqlar üçün əlverişlidir.forsayı məlum olan təkrarlar,whileşərtli təkrarlar üçündür;continueaddımı buraxır,breakdövrü bitirir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
var_dump(10 / 4); nə çap edir?