⊗ppOpIhPPP 33 of 107 menu

Problém privátních vlastností při dědění v OOP v PHP

To, že privátní vlastnosti nejsou děděny, může vést k nečekanému problému. Podívejme se na příklad. Předpokládejme, že máme následující rodičovskou třídu s privátní vlastností:

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

Předpokládejme, že v potomkově třídě jsme se rozhodli vytvořit metodu, která bude zvyšovat věk o jednu jednotku. Avšak, pokus změnit privátní vlastnost rodiče povede k chybě:

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

Chyba zmizí, pokud v potomkově třídě deklarujeme privátní vlastnost $age:

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

Tady na nás číhá past! Ve skutečnosti jsme vytvořili dvě privátní vlastnosti: jednu v rodiči a jednu v potomkovi. A ty fungují zcela nezávisle. To znamená, že metody rodiče budou měnit svou vlastnost a metody potomka - své.

Tento problém má ve skutečnosti řešení. Stačí manipulovat s privátními vlastnostmi rodiče pomocí metod tohoto rodiče. Přepišme náš kód v souladu s tímto:

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

Lze zjednodušit:

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

V následujícím kódu je v potomkově třídě přepsána metoda rodiče. Opravte problémy v tomto kódu:

<?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; // chyba } } } ?>
Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout