PHP self vs static

Elmar Aliyev
2 min readNov 29, 2023

--

Bildiyimiz kimi class daxilindəki property-ləri əldə etmək üçün self, static , this , parent keyword-lərindən istifadə edilir . Bu mövzuda biz selfstatic haqqında danışacağıq .

Aralarındaki fərqlər nələrdir ?
Nə zaman hansını istifadə etməliyik ?

Ortaq özəlliklər :
selfstatic istifadə edərək, class daxilindəki static property-lər və statik method-lara müraciət edə bilərsiz .

Fərqlər :

self istifadə edildiyi class-a müraciət edir . Bir class daxilində self yazdıqda hər zaman yazıldığı class-a müraciət edir, miras vəziyyətindən asılı olmayaraq .

static daha dinamikdir. Yazıldığı class-a run zamanı baş vurur. Əsas özəlliyi compile time-da yox runtime-da işə düşür .

Ətraflı izah :

Car və Bmw adlı class-larımız var . Car class-ı super class-dır . Bmw class-ı isə Car class-ından miras alır .

Belə başa düşə bilərik ki, Car parent-dir, Bmw isə child .

Class Car :

<?php

namespace Core;

class Car
{
/**
* @var int
*/
protected static int $maxSpeed = 280;

/**
* @return int
*/
public function get(): int
{
return self::$maxSpeed;
}
}

Class Bmw :

<?php

namespace Core;

class Bmw extends Car
{
/**
* @var int
*/
protected static int $maxSpeed = 300;
}

index.php faylında Bmw class-ını çağıraq və nəticələri görək :
(Proyektə autoload qoşulub, bu başqa bir mövzu başlığı olduğu üçün burada ondan bəhs etməyəcəyəm)

<?php

require_once "vendor/autoload.php";

use Core\Bmw;
$bmw = new Bmw();
$maxSpeed = $bmw->get();
echo $maxSpeed;

Biz nəticə olaraq 280 almış olduq .

get() method-una nəzər yetirsək burada görmüş olacağıq ki, return edərkən self yazılıb . Yəni self Car class-ını içərisində yazıldığına görə mirasdan asılı olmayaraq Car class-ının $maxSpeed property-sinin dəyərini verməlidir .

/**
* @return int
*/
public function get(): int
{
return self::$maxSpeed;
}

Ancaq, biz bu method-da dəyişiklik etsək və self::$maxSpeed yerinə static::maxSpeed yazsaq biz nəticəni 300 olaraq almış olacağıq . Çünki, Bmw class-ını new etmişik (Bmw class-ının instance-ını yaratmışıq) və get() method-unu çağırmışıq . Buna görə də Bmw class-ının $maxSpeed property-sinin dəyərini verməlidir .

github repository :

https://github.com/ElmarAliyev-7/linkedInPosts/tree/selfVsStatic

--

--