PHP में OOP विरासत में निजी गुणों की समस्या

यह तथ्य कि निजी गुण विरासत में नहीं मिलते, एक अप्रत्याशित समस्या पैदा कर सकता है। आइए एक उदाहरण से देखते हैं। मान लीजिए कि हमारे पास एक निजी गुण वाला निम्नलिखित मूल वर्ग है:

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

मान लीजिए कि व्युत्पन्न वर्ग में हमने एक ऐसी विधि बनाने का निर्णय लिया जो आयु को एक से बढ़ाएगी। हालाँकि, मूल वर्ग के निजी गुण को बदलने का प्रयास त्रुटि का कारण बनेगा:

php<?php
  class Student extends User {
    public function incAge() {
      $this->age++; // त्रुटि
    }
  }
?>

त्रुटि गायब हो जाएगी यदि व्युत्पन्न वर्ग में निजी गुण $age घोषित किया जाए:

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

यहीं पर एक और समस्या छिपी है! वास्तव में, हमने दो निजी गुण बना दिए हैं: एक मूल वर्ग में और एक व्युत्पन्न वर्ग में। और वे पूरी तरह से स्वतंत्र रूप से काम करते हैं। इसका मतलब है कि मूल वर्ग की विधियाँ अपना गुण बदलेंगी, और व्युत्पन्न वर्ग की विधियाँ - अपना गुण।

इस समस्या का वास्तव में एक समाधान है। बस मूल वर्ग के निजी गुणों को उस मूल वर्ग की विधियों के माध्यम से प्रबंधित करने की आवश्यकता है। आइए इसके अनुसार अपना कोड फिर से लिखें:

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

इसे सरल बनाया जा सकता है:

php<?php
  class Student extends User {
    public function incAge() {
      $this->setAge($this->getAge() + 1);
    }
  }
?>
Задание 1

निम्नलिखित कोड में, व्युत्पन्न वर्ग में मूल वर्ग की विधि को ओवरराइड किया गया है। इस कोड में समस्याओं को सही करें:

php<?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; // त्रुटि
      }
    }
  }
?>