Məzmuna keç
Educora
Orta18 dəq6 / 10

Siniflər və obyektlər

Siniflər yarat, konstruktorda xassələrin elanından (constructor promotion) və readonly xassələrdən istifadə et, statik üzvləri və varisliyi öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Xassələri və metodları olan sinif yazmaq, new ilə obyekt yaratmaq
  • Konstruktorda xassə elanını, readonly və görünmə səviyyələrini tətbiq etmək
  • Statik üzvlərdən və extends ilə varislikdən istifadə etmək

Bank hesabının sahibi, balansı var; ona pul qoymaq və balansı yoxlamaq olar. Məlumatı və onunla işləyən funksiyaları bir yerə toplamaq üçün obyektyönlü proqramlaşdırmadan (OOP) istifadə olunur. Laravel və Symfony kimi müasir PHP freymvorkları tamamilə siniflər üzərində qurulub, ona görə bu mövzu PHP-də peşəkar işin əsasıdır.

Sinif və obyekt

Sinif obyektlərin çertyojudur: hansı xassələri (məlumatları) və metodları (hərəkətləri) olacağını təsvir edir. Obyekt sinfin new ilə yaradılmış konkret nüsxəsidir. Metodun içində $this cari obyekti göstərir, xassə və metodlara isə -> operatoru ilə müraciət olunur. __construct metodu obyekt yaradılan anda avtomatik çağırılır.

PHP
<?php

class Account
{
    public string $owner;
    private float $balance = 0.0;

    public function __construct(string $owner)
    {
        $this->owner = $owner;
    }

    public function deposit(float $amount): void
    {
        $this->balance += $amount;
    }

    public function getBalance(): float
    {
        return $this->balance;
    }
}

$acc = new Account("Aysel");
$acc->deposit(50);
$acc->deposit(25.5);
echo $acc->owner, ": ", $acc->getBalance(), " AZN\n";
Gözlənilən nəticə
Aysel: 75.5 AZN
GörünməHaradan əlçatandır
publichər yerdən
protectedsinfin özündən və ondan törəyən siniflərdən
privateyalnız sinfin özündən
$acc->balance yazsan, Cannot access private property xətası alacaqsan — balans yalnız metodlar vasitəsilə dəyişir.

Konstruktorda xassə elanı və readonly

Yuxarıdakı sinifdə $owner üç dəfə yazılıb: xassə, parametr və mənimsətmə. PHP 8-in constructor promotion imkanı ilə görünmə səviyyəsini birbaşa konstruktorun parametrinə yazırsan — PHP xassəni özü elan edir və qiyməti özü mənimsədir.

PHP 7 üslubu
class Product
{
    private string $name;
    private float $price;

    public function __construct(string $name, float $price)
    {
        $this->name = $name;
        $this->price = $price;
    }
}
PHP 8: constructor promotion
class Product
{
    public function __construct(
        private string $name,
        private float $price,
    ) {}
}
Hər iki sinif eyni işi görür, amma sağdakı iki dəfə qısadır.

PHP 8.1-dən xassəni **readonly** elan etmək olar: ona yalnız bir dəfə, sinfin içində qiymət verilir. Sonra dəyişməyə cəhd etsən, Cannot modify readonly property Money::$amount xətası alacaqsan. Belə dəyişməz obyektlər pul, tarix və koordinat kimi qiymətlər üçün idealdır. Aşağıda pulu qəpiklə, tam ədəd kimi saxlayırıq (1 manat = 100 qəpik).

PHP
<?php

final class Money
{
    public function __construct(
        public readonly int $amount,
        public readonly string $currency = "AZN",
    ) {}

    public function add(Money $other): Money
    {
        return new Money($this->amount + $other->amount, $this->currency);
    }

    public function __toString(): string
    {
        return number_format($this->amount / 100, 2) . " " . $this->currency;
    }
}

$price = new Money(1250);
$total = $price->add(new Money(799));
echo $total, "\n";
echo $total->amount, "\n";
Gözlənilən nəticə
20.49 AZN
2049
  • add köhnə obyekti dəyişmir, yeni Money obyekti qaytarır — dəyişməz obyektlər belə işləyir.
  • Xüsusi __toString metodu obyekti sətrə çevirir, ona görə echo $total işləyir.
  • final bu sinifdən törəmə sinif yaratmağı qadağan edir.

Statik üzvlər

Statik xassə və metodlar ayrıca obyektə deyil, bütöv sinfə aiddir. Onlara Sinif::üzv yazılışı ilə, sinfin içindən isə self:: ilə müraciət olunur. Sinif sabitləri (const) də eyni qayda ilə oxunur. Aşağıda sinif neçə şagird obyekti yaradıldığını sayır.

PHP
<?php

class Student
{
    public const MAX_IN_CLASS = 30;
    private static int $count = 0;

    public function __construct(public string $name)
    {
        self::$count++;
    }

    public static function count(): int
    {
        return self::$count;
    }
}

new Student("Leyla");
new Student("Murad");
$s = new Student("Nigar");

echo Student::count(), " of ", Student::MAX_IN_CLASS, "\n";
echo $s->name, "\n";
Gözlənilən nəticə
3 of 30
Nigar

Varislik

extends açar sözü ilə sinif başqa sinfin bütün public və protected üzvlərini miras alır və istədiyi metodları yenidən yaza (override) bilər. Valideyn sinfin metoduna parent:: ilə müraciət olunur. PHP-də sinfin yalnız bir valideyni ola bilər. Eyni metodun müxtəlif siniflərdə fərqli işləməsinə polimorfizm deyilir.

PHP
<?php

class Animal
{
    public function __construct(protected string $name) {}

    public function speak(): string
    {
        return "{$this->name} makes a sound";
    }
}

class Cat extends Animal
{
    public function speak(): string
    {
        return "{$this->name} says Meow";
    }
}

class Dog extends Animal
{
    public function speak(): string
    {
        return parent::speak() . ": Woof!";
    }
}

$pets = [new Animal("Fish"), new Cat("Mestan"), new Dog("Bobik")];
foreach ($pets as $pet) {
    echo $pet->speak(), "\n";
}
Gözlənilən nəticə
Fish makes a sound
Mestan says Meow
Bobik makes a sound: Woof!

Əsas fikirlər

  • Sinif çertyojdur, obyekt onun new ilə yaradılmış nüsxəsidir; $this cari obyekti, -> isə üzvə müraciəti bildirir.
  • public, protected, private üzvlərin haradan görünəcəyini müəyyən edir; məlumatı private saxlayıb metodlarla dəyiş.
  • Constructor promotion (PHP 8) xassəni konstruktorun parametrində elan edir; readonly (PHP 8.1) xassəni dəyişməz edir.
  • Statik üzvlər sinfə aiddir və self:: ya da Sinif:: ilə oxunur.
  • extends varislik yaradır, parent:: valideynin metodunu çağırır, final isə varisliyi qadağan edir.

Özünü yoxla

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

1 / 10
Metodun içində $this nəyi göstərir?