Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Dlaczego metody nie są dziedziczone?
Forum PHP.pl > Forum > Przedszkole
Asmox
Zaznaczam na początku, że dopiero zaczynam przygodę z programowaniem obiektowym, więc proszę się nie śmiać.

Od jakiegoś czasu zajmuję się klasową stronką - teraz robię nowy projekt. Kupiłem sobie książkę, która jest w większej części o programowaniu obiektowym. Pierwsze przykłady w niej dotyczyły menadżera kontaktów. Ponieważ mi nie jest potrzebny menadżer kontaktów, postanowiłem przerobić to na menadżer userów biggrin.gif .
Na początku zająłem się trzema klasami: PropertyObject (obiekt własności wspomagający uzyskiwanie dostępu do poszczególnych własności klasy), DataManager (pobiera dane z bazy danych i zwraca odpowiednie wartości), no i Contact (informacje o użytkowniku). Nie wiem niestety czemu, ale mimo informacji o dziedziczeniu, metody klasy PropertyObject nie znajdują się w klasie Contact. Oto kody:

CPropertyObject.php
  1. <?php
  2.  require_once("interfaces/IValidator.php");
  3.  abstract class PropertyObject implements Validator {
  4.    
  5.    protected $propertyTable = array();           // Pary nazwa - własność z bazy danych
  6.    protected $data;                              //Dane z bazy danych
  7.    protected $changedProperties = array();       //Własności, które zostały zmienione
  8.    protected $errors = array();                  //Błędy walidacji
  9.    
  10.    public function __construct($arData) {
  11.      $this->data = $arData;                      //Nadanie zmiennej tablicy z bazy danych
  12.    }
  13.    
  14.    function getProp($what) {
  15.      if (array_key_exists($what, $this->propertyTable))
  16.        return $this->data[$this->propertyTable[$what]];
  17.    }
  18.    function setProp($what, $how) {
  19.      if (array_key_exists($what, $this->proprertyTable)) {
  20.        $this->data[$this->propertyTable[$what]] = $how;
  21.        $changedProperties[] = $what;
  22.      }
  23.    }
  24.    function validate() {}
  25.  }
  26. ?>


CContact.php
  1. <?php
  2. require_once("CPropertyObject.php");
  3.  
  4. class Contact extends PropertyObject
  5. {
  6.  function __construct($contactID) {
  7.    $arData = DataManager::getContactData($contactID);
  8.    
  9.    parent::__construct($arData);
  10.    
  11.    $this->PropertyTable['contactid'] = 'contact_id';
  12.    $this->PropertyTable['id'] = 'contact_id';
  13.    $this->PropertyTable['userid'] = 'user_id';
  14.    $this->PropertyTable['firstname'] = 'sname1';
  15.    $this->PropertyTable['lastname'] = 'sname2';
  16.    $this->PropertyTable['e-mail'] = 'email';
  17.    $this->PropertyTable['gg'] = 'gadu_gadu';
  18.    $this->PropertyTable['skype'] = 'skype';
  19.  }
  20.  function validate() {
  21.    if(!is_integer(getProp('gg'))) $this->errors['gg'] = 'Numer gadu-gadu nie jest liczbą!';
  22.  }
  23.  
  24.  function wypisz() {
  25.  return $this->data['sname1'];
  26.  }
  27.  
  28.  function __toString() {
  29.   /*LINIA 29*/ return getProp('firstname') . ' ' . getProp('lastname');
  30.  }
  31. }
  32.  
  33. ?>


No i jeszcze musiałem jakoś przetestować działanie obiektów:

test.php
  1. <?php
  2. require_once("modules/ACDataManager.php");
  3. require_once("modules/CContact.php");
  4.  
  5. $obj = new Contact(1);
  6. echo $obj;
  7. echo $obj->wypisz();
  8. ?>


Uruchomienie tego skryptu owocuje wygenerowaniem błędu:
Cytat
Fatal error: Call to undefined function getprop() in D:\servhost\Kronika\modules\CContact.php on line 29

Co jest nie tak? Co zrobiłem źle?
nospor
nie getProp('firstname') a $this->getProp('firstname')
analogicznie reszta

poczytaj najpierw o podstawach obiektowki, do ktorych to magiczne slowo $this sie zalicza
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.