⚔️წვდომის მოდიფიკატორები
❓ რა არის და რისთვის გვჭირდება
წვდომის მოდიფიკატორების (access modifiers) საშუალებით შეგვიძლია განვსაზღვროთ გვინდა თუ არა ჩვენი კლასის თვისებების წაკითხვა და ჩაწერა შესაძლებელი იყოს ობიექტის გარედან. არსებობს 3 წვდომის მოდიფიკატორი, ესენია: public, private და protected.
public - მოდიფიკატორით თვისებაზე წვდომა გვაქვს ობიექტის შიგნითაც და გარეთაც.
private - მოდიფიკატორით თვისებაზე წვდომა მხოლოდ ობიექტის შიგნით გვაქვს
protected - მოდიფიკატორში კი მხოლოდ შიგნით და მემკვიდრე კლასის ობიექტებში. (მემკვიდრეობითობა განხილული იქნება ცოტა მოგვიანებით)
მოდიფიკატორების კარგად გასააზრებლად ყურადღებით გაეცანი შემდეგ მაგალითებს.
<?php
class Human
{
public string $name;
public string $lastName;
function __construct(string $name, string $lastName){
$this->name = $name;
$this->lastName= $lastName;
}
public function print(){
// ობიექტს შიგნით / კლასში
echo "$this->name - $this->lastName \n";
}
}
$john= new Human('Tonny','Stark');
$john->print(); // Tonny- Stark
// ობიექტს გარეთ
$john->lastName = 'Lanister';
$john->print(); // Tonny - Lanister<?php
class Human
{
public string $name;
// private
private string $lastName;
function __construct(string $name, string $lastName){
$this->name = $name;
$this->lastName= $lastName;
}
// CASE 1: ობიექტს შიგნით / კლასში
public function print(){
echo "$this->name - $this->lastName \n"; // იმუშავებს
}
}
// ობიექტს გარეთ
$john= new Human('Tonny','Stark');
$john->print(); // output: Tonny- Stark
// CASE 2: მუშაობს რადგან name-ზე public მოდიფიკატორია
$john->name = 'Joseph';
$john->print(); // output: Joseph- Stark
// CASE 3: არ იმუშავებს [Error] რადგან age - private არის Human ისთვის
// Error: Cannot access private property Human::$lastName
// $john->lastName = 'Seed';
// $john->print();
php<?php
class Human
{
public string $name; // public
protected string $lastName; // protected
private string $age; // private
function __construct(string $name, string $lastName, int $age){
$this->name = $name;
$this->lastName= $lastName;
$this->age= $age;
}
// CASE 1: ობიექტს შიგნით / კლასში
public function print(){
echo "$this->name - $this->lastName \n"; // იმუშავებს
}
}
// კოდში მემკვიდრეობითობის ნაწილი შეიძლება არ იყოს გასაგები
// მაგრამ მაგას ოდნავ მოგვიანებით გავარჩევთ
class Child extends Human
{
private string $favoriteToy; // private
function __construct(string $name, string $lastName, int $age, string $favToy){
// მომდევნო ხაზი უბრალოდ მშობელ კონსტრუქტორს იძახებს
parent::__construct($name,$lastName,$age);
$this->favoriteToy = $favToy;
}
// მემკვიდრე ობიექტში / კლასში
public function printChild(){
// CASE 2: იმუშავებს რახან lastName protected არის
echo "His name is $this->lastName \n";
// CASE 3: არ იმუშავებს [Error] რადგან age - private არის Human ისთვის
// echo "$this->age";
// CASE 4: იმუშავებს რადგან favoriteToyprivate არის თვითნ Child ისთვის
echo "and he/she loves $this->favoriteToy\n";
}
}
// ობიექტს გარეთ
$john= new Child('John','Lenon', 30, 'fluffy teddy bear');
// CASE 5: იმუშავებს name - public-ია
$john->name = 'Joseph'; // ეს მუშაობს რადგან name-ზე public მოდიფიკატორია
// CASE 6: არ იმუშავებს name - public-ია
// $john->lastName = 'Seed'; // აქ კი ერორი გვაქ
// Error: Cannot access protected property Child::$lastName
$john->printChild();
// output:
//
// His name is Lenon
// and he/she loves fluffy teddy bear
🛠️ Getters & Setters
წვდომის მოდიფიკატორები გვეხმარება რომ დავიცვათ ინფორმაციის მთლიანობა, რომ ინფორმაცია არ იცვლებოდეს არასასრუველი ადგილიდან, და თავი დავიზღვიოთ ადამიანური მექანიკური შეცდომებისაგან. ამ ყველაფერ დადებითობასთან ერთად გასათვალისწინებელია ესეთი შემთხვევაც. რა უნდა ვქნათ როცა გვაწყობს რომ თვისება იყოს private მაგრამ მაინც გვინდა მისი მნიშვნელობის წაკითხვა ან შეცვლა ობიექტის გარედან? სწორედ აქ გვევლინებიან გმირებად გეთერები და სეთერები. ისინი წარმოადგენენ ჩვენს მიერ დაწერილ მეთოდებს რომელთა გამოძახებითაც შესაძლებელია ობიექტის გარედან ინფორმაციის წაკითხვა და ჩაწერა. მომდევნო კოდში შეგიძლია გადახედო ერთ-ერთ მაგალითს.
<?php
class Human
{
private string $name;
private string $lastName;
public function __construct(string $name, string $lastName){
$this->name = $name;
$this->lastName= $lastName;
}
// Getters
public function getName(){
return $this->name;
}
public function getLastName(){
return $this->lastName;
}
// Setters
public function setName(string $value){
$this->name = $value;
}
public function setLastName(string $value){
$this->lastName= $value;
}
}
$spiderMan= new Human('Peter','Parker');
// Retrive data with Getter
echo $spiderMan->getName() . ' ' . $spiderMan->getLastName() . "\n";
// Output: Peter Parker
// This would be an error since name & lastName are private
// echo "$spiderMan->name $spiderMan->lastName \n";
// Set Data with Setter
$spiderMan->setName('Tom');
$spiderMan->setLastName('Holland');
// print changed attribute values
echo $spiderMan->getName() . ' ' . $spiderMan->getLastName() . "\n";
// Output: Tom Holland
Last updated