පීඑච්පී OOP හි උරුමකම ලබන අවස්ථාවේ පෞද්ගලික ගුණාංගවල ඇති ගැටලුව
පෞද්ගලික ගුණාංග උරුම නොවන බව, නොපෙන්වන ගැටලුවකට හේතු විය හැක. අපි උදාහරණයක් බලමු. පෞද්ගලික ගුණාංගයක් සහිත පහත දක්වන මව්-ක්රමය ඇතැයි සිතමු:
<?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; // දෝෂය
}
}
}
?>