PHP self vs static
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 self
və static
haqqında danışacağıq .
Aralarındaki fərqlər nələrdir ?
Nə zaman hansını istifadə etməliyik ?
Ortaq özəlliklər :self
və static
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