Məzmuna keç
Educora
Başlanğıc17 dəq3 / 10

Operatorlar, şərtlər və dövrlər

Hesab və müqayisə operatorlarını öyrən, == ilə === fərqini və tiplərin avtomatik çevrilməsini anla, if, match və dövrlərlə proqrama qərar verməyi öyrət.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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ək
  • if/elseif/else, match, for və while ilə 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
<?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";
Gözlənilən nəticə
22
12
85
3.4
2
289
3
int(2)
31
  • / həmişə dəqiq bölür: 17 / 5 nəticəsi 3.4-dür. Tam bölünəndə isə nəticə int olur: 10 / 5 → int(2). Qalıqsız tam hissə üçün intdiv iş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
<?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);
Gözlənilən nəticə
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
int(-1)
Səhv: `0 == false` doğrudur
$text = "PHP is fun";

if (strpos($text, "PHP") == false) {
    echo "Not found"; // printed by mistake!
}
Düzgün (PHP 8)
$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
<?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");
Gözlənilən nəticə
Welcome!
Guest
az
bool(false)
bool(true)

if, elseif və match

PHP
<?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";
Gözlənilən nəticə
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
<?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";
Gözlənilən nəticə
Day 6 is a weekend
Score 83 gives B
Köhnə: switch
switch ($status) {
    case 'new':
        $label = 'New order';
        break;
    case 'paid':
        $label = 'Paid';
        break;
    default:
        $label = 'Unknown';
}
Müasir: match (PHP 8)
$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
<?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";
Gözlənilən nəticə
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, intdiv isə tam hissəni verir.
  • == tipləri çevirib müqayisə edir, === isə tipi də yoxlayır — defolt olaraq === yaz.
  • ?? mövcud olmayan və ya null qiymət üçün defolt verir, ??= isə yalnız boş dəyişənə yazır.
  • match sərt müqayisə edir, qiymət qaytarır və break tələb etmir; match (true) aralıqlar üçün əlverişlidir.
  • for sayı məlum olan təkrarlar, while şərtli təkrarlar üçündür; continue addımı buraxır, break dövrü bitirir.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
var_dump(10 / 4); nə çap edir?