Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z $this
Forum PHP.pl > Forum > PHP > Object-oriented programming
Sa1rus
Witam,
Mam problem z przykładem z książki PHP5. Zaawansowane programowanie.
Czy mogłby mi ktoś wytłumaczyć o co chodzi z $this, poniżej podaje kod...

  1. <?php
  2. require_once('class.PropertyObject.php');
  3.  
  4. class Address extends PropertyObject {
  5.  
  6. function __construct($addressid) {
  7. $arData = DataManager::getAddressData($addressid);
  8.  
  9. parent::__construct($arData);
  10.  
  11. // PropertyTable przechowuje pary nazwa-wartość przypisujące własności do pól bazy danych
  12.  
  13. $this->propertyTable['addressid'] = 'adres_id';
  14. $this->propertyTable['id'] = ' adres_id ';
  15. $this->propertyTable['entityid'] = 'jednostka_id';
  16. $this->propertyTable['address1'] = 'sadres1';
  17. $this->propertyTable['address2'] = 'sadres2';
  18. $this->propertyTable['city'] = 'smiasto';
  19. $this->propertyTable['zipcode'] = 'skod';
  20. $this->propertyTable['type'] = 'styp';
  21. }
  22.  
  23. function validate() {
  24. if(strlen($this->zipcode) != 6) {
  25. $this->errors['zipcode'] = 'Należy podać poprawny kod pocztowy.';
  26.  
  27. ...
  28. }


Czy w funkcji validate() nie powinno być $this->PropertyTable['zipcode'] !=6 ?
Przecież (przynajmniej tak mi się wydaje) $this powinno odwoływać się do właściwości klasy, a zmienna zipcode sama w sobie nie zostala zadeklarowana.

Czy mógłby mi ktoś to jakoś wytłumaczyć ?
wookieb
Poczytaj o magicznych metodach __get i __set, które prawdopodobnie zostały użyte w PropertyObject.
Musisz nam podać kod PropertyObject abyśmy mogli stwierdzić jak naprawdę się to odbywa.
Sa1rus
  1. <?php
  2. require_once('interface.Validator.php');
  3.  
  4. abstract class PropertyObject implements Validator {
  5.  
  6. protected $propertyTable = array(); // Przechowuje pary nazwa-wartoľć
  7. // przypisujące własnoľci do
  8. // pól bazy danych
  9. protected $changedProperties = array(); // Lista własnoľci, które zostały
  10. // zmodyfikowane
  11.  
  12. protected $data; // Dane z bazy danych
  13.  
  14. protected $errors = array(); // Ewentualne błędy walidacji
  15.  
  16. public function __construct($arData) {
  17. $this->data = $arData;
  18. }
  19.  
  20. function __get($propertyName) {
  21. if(!array_key_exists($propertyName, $this->propertyTable))
  22. throw new Exception("Błędna własnoľć \"$propertyName\"!");
  23.  
  24. if(method_exists($this, 'get' . $propertyName)) {
  25. return call_user_func(array($this, 'get' . $propertyName));
  26. } else {
  27. return $this->data[$this->propertyTable[$propertyName]];
  28. }
  29. }
  30.  
  31. function __set($propertyName, $value) {
  32. if(!array_key_exists($propertyName, $this->propertyTable))
  33. throw new Exception("Błędna własnoľć \"$propertyName\"!");
  34. if(method_exists($this, 'set' . $propertyName)) {
  35. return call_user_func(
  36. array($this, 'set' . $propertyName),
  37. $value
  38. );
  39. } else {
  40.  
  41. // Jeľli wartoľć własnoľci uległa zmianie i nie ma jej
  42. // jeszcze w tabeli changedProperties, zostaje do niej dołšczona
  43. if($this->propertyTable[$propertyName] != $value &&
  44. !in_array($propertyName, $this->changedProperties)) {
  45. $this->changedProperties[] = $propertyName;
  46. }
  47.  
  48. // Przypisuje nowš wartoľć
  49. $this->data[$this->propertyTable[$propertyName]] = $value;
  50.  
  51. }
  52. }
  53.  
  54. function validate() {
  55.  
  56. }
  57.  
  58. }
  59. ?>
wookieb
Czyli miałem rację.
Sa1rus
A mozesz swoja odpowiedz jakos rozwinac ?
Crozin
Jeszcze odnośnie:
Cytat
Przecież (przynajmniej tak mi się wydaje) $this powinno odwoływać się do właściwości klasy
$this nie odwołuje się do właściwości obiektu (nie myl go z klasą), a do samego obiektu - jest to referencja do niego.
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-2024 Invision Power Services, Inc.