- Xassələri və metodları olan sinif yazmaq,
newilə obyekt yaratmaq - Konstruktorda xassə elanını,
readonlyvə görünmə səviyyələrini tətbiq etmək - Statik üzvlərdən və
extendsilə 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
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";Aysel: 75.5 AZN
| Görünmə | Haradan əlçatandır |
|---|---|
public | hər yerdən |
protected | sinfin özündən və ondan törəyən siniflərdən |
private | yalnı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.
class Product
{
private string $name;
private float $price;
public function __construct(string $name, float $price)
{
$this->name = $name;
$this->price = $price;
}
}class Product
{
public function __construct(
private string $name,
private float $price,
) {}
}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
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";20.49 AZN 2049
addköhnə obyekti dəyişmir, yeniMoneyobyekti qaytarır — dəyişməz obyektlər belə işləyir.- Xüsusi
__toStringmetodu obyekti sətrə çevirir, ona görəecho $totalişləyir. finalbu 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
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";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
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";
}Fish makes a sound Mestan says Meow Bobik makes a sound: Woof!
Əsas fikirlər
- Sinif çertyojdur, obyekt onun
newilə yaradılmış nüsxəsidir;$thiscari obyekti,->isə üzvə müraciəti bildirir. public,protected,privateüzvlərin haradan görünəcəyini müəyyən edir; məlumatıprivatesaxlayı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 daSinif::ilə oxunur. extendsvarislik yaradır,parent::valideynin metodunu çağırır,finalisə varisliyi qadağan edir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
$this nəyi göstərir?