⊗ppOpIhPPP 33 of 107 menu

Problema proprietăților private la moștenire în OOP în PHP

Faptul că proprietățile private nu sunt moștenite, poate duce la o problemă neașteptată. Să vedem un exemplu. Să presupunem că avem următoarea clasă-părinte cu o proprietate privată:

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

Să presupunem că în clasa-descendent am decis să creăm o metodă care va crește vârsta cu o unitate. Însă, încercarea de a modifica proprietatea privată a părintelui va duce la o eroare:

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

Eroarea va dispărea dacă în clasa-descendent declarăm o proprietate privată $age:

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

Aici ne așteaptă capcana! De fapt, am generat două proprietăți private: una în părinte și una în descendent. Și ele funcționează complet independent. Aceasta înseamnă că metodele părintelui vor modifica propria lor proprietate, iar metodele descendentului - propriile lor.

Această problemă are de fapt o soluție. Pur și simplu trebuie să manipulăm proprietățile private ale părintelui prin metodele acestui părinte. Să rescriem codul nostru în conformitate cu aceasta:

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

Putem simplifica:

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

În următorul cod în clasa descendentă este redefinită metoda părintelui. Corectați problemele din acest cod:

<?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; // eroare } } } ?>
Română
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Folosim cookie pentru funcționarea site-ului, analiză și personalizare. Prelucrarea datelor are loc în conformitate cu Politica de confidențialitate.
acceptă toate configurează respinge