⊗ppOpIhPPP 33 of 107 menu

PHP da OOP da meros olishda xususiy xususiyatlar muammosi

Xususiy xususiyatlar meros olinmasligi kutilmagan muammoga olib kelishi mumkin. Keling, buni misol bilan ko'ramiz. Faraz qilaylik, bizda quyidagi ota-sinf xususiy xususiyatga ega:

<?php class User { private $age; public function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } } ?>

Faraz qilaylik, voris sinfda biz yoshni birga oshiradigan metod yaratmoqchimiz. Biroq, ota-sinfin xususiy xususiyatini o'zgartirishga urinish xatolikka olib keladi:

<?php class Student extends User { public function incAge() { $this->age++; // xato } } ?>

Agar voris sinfda xususiy xususiyat $age ni e'lon qilsak, xato yo'qoladi:

<?php class Student extends User { private $age; public function incAge() { $this->age++; } } ?>

Aynan shu joyda bizni tuzoq kutmoqda! Aslida biz ikkita xususiy xususiyat yaratdik: biri ota-sinfda va biri voris sinfda. Va ular butunlay mustaqil ishlaydi. Bu shuni anglatadiki, ota-sinf metodlari o'z xususiyatini o'zgartiradi, voris sinf metodlari esa o'zini.

Bu muammoning yechimi aslida mavjud. Shunchaki ota-sinfning xususiy xususiyatlarini ushbu ota-sinfning metodlari orqali boshqarish kerak. Keling, kodimizni shunga mos ravishda qayta yozamiz:

<?php class Student extends User { public function incAge() { $age = $this->getAge(); $age++; $this->setAge($age); } } ?>

Soddalashtirish mumkin:

<?php class Student extends User { public function incAge() { $this->setAge($this->getAge() + 1); } } ?>

Quyidagi kodda voris sinfda ota-sinf metodi qayta belgilanadi. Ushbu koddagi muammolarni tuzating:

<?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; // xato } } } ?>
azbydeenesfrkakkptruuz