PHPPamokos.lt


6. Matomumas - public, private, protected ir kt.

Klasės metodai ir savybės gali turėti atributų, kurie nurodo jų matomumą iš išorės.

Jau matėme raktažodį final, kuris uždraudžia perrašyti tam tikrą metodą dukterinėse klasėse, tai panašiu principu veikia ir matomumo komandos, rašomos prieš metodo ar savybės apibrėžimą:

  • public
  • private
  • protected

Pavyzdys

class Users {
	private var $credit_card;
	public var $name;

	protected function getCreditCard() { ... }
}

Dabar atskirai apie visus tris ir ką jie reiškia.

Raktažodis public reiškia, kad tas metodas ar savybė yra prieinama visose tos klasės dukterinėse klasėse ir sukurtuose objektuose. Tai ir yra mums įprastas veikimas, kurį ir naudojome iki šiol.

class Users {
	public var $name;

	public function getName() { 
		return ucfirst($this->name); 
	}
}

class Women {
	public var $maiden_name;

	public function getName() { 
		return ucfirst($this->name . ' ' . $this->maiden_name); 
	}
}

$user = new Users;
echo $user->name;
echo $user->getName();

Čia savybė $name ir metodas getName prieinami ir gali būti naudojami visur.

Raktažodis private, kaip turbūt nesunku numanyti, veikia priešingai - paslepia savybę ar metodą nuo "pernaudojimo" kitur. Jis prieinamas tik pačioje klasėje, ir neprieinamas nei dukterinėms klasėms, nei sukurtiems objektams.

class Users {
	private var $name;

	private function getName() { 
		return ucfirst($this->name); // čia suveiks gerai
	}
}

class Women {
	public function maidenName() { 
		return ucfirst($this->name); // išmes klaidą, nes neras $this->name
	}
}

$user = new Users;
echo $user->name; // išmes klaidą, nes neras $name
echo $user->getName(); // išmes klaidą, nes neras metodo getName()

Kaip matote komentaruose, PHP išmes klaidą visur, kur "nematys" tos savybės ar metodo - t.y. už pačios klasės ribų.

Ir raktažodis protected: jis yra kaip tarpinis variantas - leidžia prie savybės ar metodo prieiti tos klasės dukterinėms ir tėvinėms klasėms, bet neleidžia to padaryti sukurtiems objektams.

class Users {
	protected var $name;

	protected function getName() { 
		return ucfirst($this->name); // čia suveiks gerai
	}
}

class Women {
	public function maidenName() { 
		return ucfirst($this->name); // čia suveiks gerai
	}
}

$user = new Users;
echo $user->name; // išmes klaidą, nes neras $name
echo $user->getName(); // išmes klaidą, nes neras metodo getName()

Geriausiai skirtumą vizualiai pavaizduoja šis paveiksliukas:

Kaip matote, kas name tas privatu ("private"), berniukas kieme yra "apsaugotas" ("protected") bet gali eiti ir į namą, o viskas kas už tvoros - prieinama viešai ("public").

Svarbu žinoti, kad jeigu prieš metodą ar savybę nėra jokios komandos, tai laikoma public.

Kam to reikia?

Dabar turbūt esminis klausimas - o kam apskritai to reikia? Kam kažką viešinti ar slėpti?

Čia yra svarbus taip vadinamas "dizainas". Ne tas dizainas kur su spalvomis ir paveiksliukais, bet architektūros dizainas - bent jau angliškai yra vartojamas terminas "design", nors aš labiau linkęs vartoti "architektūra", kad būtų suprantamiau.

Taigi, klasių architektūra turi būti, kaip jau ne kartą minėjau, kruopščiai apgalvota, tame tarpe ir kas kokiai klasei yra prieinama.
Tikslas - nuo išorės paslėpti kuo daugiau. Nes idealiu atveju mes kuriame klasę, kuri veiktų nepriklausomai nuo kitų klasių ir tvarkytųsi su savybėmis ir metodais savo viduje, o iš išorės mes kviestume tik vieną ar kelis mums prieinamus ir žinomus metodus.

Visiškai realus pavyzdys iš gyvenimo - automobilio konstrukcija. Vairuotojui prieinamos tik tos funkcijos, kurios yra salone - vairas, pedalai, skydelis, įvairūs mygtukai. O kaip tos funkcijos veikia - visa tai vyksta "po kapotu" ir vairuotojui ne tik kad nereikia to žinoti, bet ir būtų didesnė tikimybė kažką sugadinti, jei jis lengvai prieitų prie tų vidinių funkcijų - jų tvarkymą geriau patikėti specialistams.

Šioje analogijoje nepaminėjau tik protected varianto - tai čia būtų variklio ar kitos vidinės automobilio funkcijos, kurios vienodos tos pačios markės automobiliams ar jų serijai. Pvz jei žinai kur yra variklis Toyota Auris automobilyje, tai labai didelė tikimybė kad ir kitų metų Auris automobiliai turės variklį būtent ten.

Taigi, kuriant architektūrą, mūsų tikslas - daryti viską kiek įmanoma private ir protected, o į išorę leisti tik tai, ką tikrai žinome kad galima "saugiai" naudoti.



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