Կարդալու համար նախատեսված հատկությունները OOP-ում PHP-ում
Դիտարկենք դաս, որում բոլոր հատկությունները պրիվատ են:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Այժմ եկեք անենք, որ այս հատկությունները արտաքին աշխարհում հասանելի լինեն միայն կարդալու համար: Նախկինում մենք արդեն անում էինք նման բան, ստեղծելով գետտերներ յուրաքանչյուր հատկության համար և չստեղծելով սետտերներ:
Եկեք այժմ այս խնդիրը լուծելու համար օգտագործենք
կախարդական մեթոդը __get: Մենք կվերադարձնենք
դրանում հարցված հատկության արժեքը: Ինչպես
անել դա՝ հարցված հատկության անունը հայտնվում է
մեթոդի պարամետրում __get, մեր դեպքում
$property:
Սա նշանակում է, որ մենք կարող ենք կարդալ հատկությունը,
որի անունը պահվում է փոփոխականում, ահա այսպես:
$this->$property (հատկության անունը կլինի
փոփոխական, այսինքն՝ սկզբում դոլար նշանով, մենք
սա անցել ենք նախորդ դասերում):
Եկեք ստեղծենք նկարագրված __get մեթոդը.
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Օգտագործենք այն հատկությունները կարդալու համար.
<?php
$test = new Test;
echo $test->prop1; // կարտածի 1
echo $test->prop2; // կարտածի 2
?>
Ինչ-որ բան գրելու փորձը հատկության մեջ կհանգեցնի սխալի.
<?php
$test = new Test;
$test->prop1 = 2; // կտա սխալ
?>
Սա հենց այն է, ինչ մեզ պետք է. հատկությունը կարելի է կարդալ, բայց չի կարելի գրել:
Գոյություն չունեցող հատկություն կարդալու փորձը կտա սխալ.
<?php
$test = new Test;
echo $test->prop3; // կտա սխալ
?>
Ուշադրություն դարձրեք նաև հետևյալ նրբերանգին. երբ մենք հատկությունները դարձնում էինք միայն կարդալու համար հին եղանակով, ապա հատկությունը կարդալու համար մենք օգտագործում էինք մեթոդ-գետտեր:
Նոր եղանակով մենք կդիմենք հենց հատկություններին, կարծես դրանց հասարակական են: Բայց դրանց մեջ գրել չենք կարող, կարծես դրանց պրիվատ են:
Թող տրված լինի ահա այսպիսի User դասը, որի հատկությունները
մատչելի են միայն կարդալու համար օգտագործելով
գետտերներ.
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Վերափոխեք այս դասի կոդն այնպես, որ գետտերների փոխարեն օգտագործվի
կախարդական
մեթոդ __get: