⊗ppOpIhPPP 33 of 107 menu

პრივატული თვისებების მემკვიდრეობის პრობლემა 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; // შეცდომა } } } ?>
azbydeenesfrkakkptruuz