PHPPamokos.lt


7. Static metodai ir savybės

Šioje pamokoje išnagrinėsime gan svarbų OOP terminą - statines savybes ir metodus.

Sintaksiškai, static tėra dar vienas požymis prie savybės ar metodo apibrėžimo - rašomas lygiai taip pat kaip public ar final. Dar daugiau, tokių komandų gali būti keletas prie vieno metodo/savybės.

public static final getName() { ... }

Na, bet mums svarbus raktažodis static. Tiesą pasakius, su juo jau esate netiesiogiai susidūrę - ten, kur bandėme kviesti metodus ar savybes su dviem dvitaškiais ::.

Trumpai tariant, static reiškia tai, kad tą metodą ar savybę galima kviesti, nekuriant tos klasės objekto. Turbūt, skamba sudėtingai, paaiškinsiu su paprastu pavyzdžiu.

Sakykime, kad norite kurti atskirą klasę Money darbui su pinigais, kuri turėtų N metodų - perskaičiuoti pinigus, konvertuoti juos kaip nors, paskaičiuoti mokesčius ir panašiai. Kaip tai atrodytų:

class Money {

	function convertToEur($lt) {
		return round($lt / 3.4528, 2);
	}

}

$money = new Money;
echo $money->convertToEur(100);

Pagrindinė mintis ir pagrindinis trūkumas - jūs turite kurti klasės Money objektą kad panaudotumėte jos metodą. Nepatogu. Būtent tam ir sukurtos statinės klasės - jų metodus galite kviesti be objekto sukūrimo, panaudodami klasės pavadinimą ir jau minėtus du dvitaškius.

class Money {

	static function convertToEur($lt) {
		return round($lt / 3.4528, 2);
	}

}

echo Money::convertToEur(100);

Didžiausias to pritaikymas yra būtent tokiose "pagalbinėse" klasėse, kurios veikia kaip visiškai atskiras blokas, kur kada nori tada panaudoji. Čia panašiai, jei be OOP turėtume kažkokį failą functions.php ir kviestume iš ten funkcijas. Tai čia tas pats, tik tos funkcijos apjungtos į klases pagal prasmę.

Tas pats galioja ir klasės savybėms - galima jas paskelbti statinėmis ir prieiti per klasės pavadinimą ir dvitaškius.

class Money {
	static $rate = 3.4528;
}

echo Money::$rate;

Atkreipkite dėmesį, kad skirtingai nuo $this->, po dviejų dvitaškių vis tiek rašomas $ ženklas.

Kaip ir patogu, ar ne? Bet yra ir trūkumas - jeigu deklaruosite metodą ar savybę kaip static, tai nebegalėsite prie jos prieiti per $this - vietoje to reikia vartoti žodį "self" su dviem dvitaškiais - self::$rate.

Bendrai statiniai metodai ir savybės yra laikomi, sakykime taip, nelabai gera praktika, jais nereikia piktnaudžiauti. Nes, pažvelgus į OOP teoriją, statinės savybės praktiškai sulaužo visą tą architektūrinę logiką, nes prie savybių ar metodų galima prieiti iš bet kur kaip prie globalių kintamųjų. Taip juos tampa sunkiau valdyti, sudėtingiau pastebėti klaidas, testuoti kodą ir t.t.

Konstantos

Viena iš klaidų, kurias daro programuotojai, tai apibrėžia klasės savybę kaip kintamąjį, kad galėtų tą savybę vėliau išnaudoti funkcijose, bet pati reikšmė niekada nesikeičia. Toks principas veikia, bet reikšmėms, kurios niekada niekada nesikeis, reikia kurti konstantas. OOP pasaulyje tai veikia lygiai taip pat kaip ir įprastos konstantos, tik pasiekiamos jos per static būdą, ir prieš konstantas be abejo nereikia rašyti nei var, nei dolerio ženklo $. Taip pat dažniausiai konstantų pavadinimai rašomi didžiosiomis raidėmis.

class Money {
	const RATE = 3.4528;

	static function convertToEur($lt) {
		return round($lt / self::RATE, 2);
	}	
}

echo Money::RATE;


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com