OOP-ում PHP-ում ժառանգման ընթացքում մասնավոր հատկությունների խնդիրը
Փաստը, որ մասնավոր հատկությունները չեն ժառանգվում, կարող է հանգեցնել անսպասելի խնդրի: Եկեք նայենք օրինակով: Ենթադրենք, մենք ունենք հետևյալ ծնող դասը մասնավոր հատկությամբ.
<?php
class User {
private $age;
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
}
?>
Ենթադրենք, որ սերած դասում մենք որոշել ենք ստեղծել մեթոդ, որը կավելացնի տարիքը մեկով: Սակայն, ծնողի մասնավոր հատկությունը փոխելու փորձը կհանգեցնի սխալի.
<?php
class Student extends User {
public function incAge() {
$this->age++; // սխալ
}
}
?>
Սխալը կվերանա, եթե սերած դասում
հայտարարվի մասնավոր հատկություն $age.
<?php
class Student extends User {
private $age;
public function incAge() {
$this->age++;
}
}
?>
Ահա թե որտեղ է մեզ սպասում թակարդը! Իրականում մենք ստեղծել ենք երկու մասնավոր հատկություն. մեկը ծնողում և մեկը սերածում: Եվ դրանք աշխատում են ամբողջովին անկախ: Սա նշանակում է, որ ծնողի մեթոդները կփոխեն իրենց հատկությունը, իսկ սերածի մեթոդները՝ իրենցը:
Այս խնդիրն իրականում լուծում ունի: Պարզապես անհրաժեշտ է կառավարել ծնողի մասնավոր հատկությունները այդ ծնողի մեթոդների միջոցով: Եկեք վերագրենք մեր կոդը համապատասխանաբար.
<?php
class Student extends User {
public function incAge() {
$age = $this->getAge();
$age++;
$this->setAge($age);
}
}
?>
Կարելի է պարզեցնել.
<?php
class Student extends User {
public function incAge() {
$this->setAge($this->getAge() + 1);
}
}
?>
Հետևյալ կոդում սերած դասում վերասահմանվում է ծնողի մեթոդը: Ուղղեք այս կոդի խնդիրները.
<?php
class User {
private $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
class Employee extends User {
public function setName($name) {
if (strlen($name) > 0) {
$this->name = $name; // սխալ
}
}
}
?>