Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Prośba o sprawdzenie klasy
Jarod
post
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


W książce natrafiłem na przykład, który wydaje mi się błędny. Wiem, że książki helionu mają literówki i różnego rodzaju błędy (na stronie helionu w erracie nie ma poprawki do tego), dlatego proszę o sprawdzenie poniższego kodu.


  1. <?php
  2. interface Validator{
  3. abstract function validate();
  4. }
  5. ?>


  1. <?php
  2. require_once('interface.Validator.php');
  3.  
  4. abstract class PropertyObject implements Validator {
  5.  
  6. protected $propertyTable = array();  //Przechowuje pary nazwa-wartość przypisujące
  7. //własności do pól bazy danych
  8. protected $changedProperties = array(); //Lista własności które zostały zmodyfikowane
  9. protected $data; //Dane z bazy
  10. protected $errors = array();
  11.  
  12. public function __construct($arData) {
  13. $this->data = $arData;
  14. }
  15.  
  16. function __get($propertyName) {
  17. if (!array_key_exists($propertyName, $this->propertyTable))
  18. throw new Exception('Błędna własność '.$propertyName.'!');
  19.  
  20. if (method_exists($this, 'get' , $propertyName)) {
  21. return call_user_func(array($this, 'get' , $propertyName));
  22. }
  23. else { 
  24. return $this->data[$this->propertyTable[$propertyName]];
  25. }
  26. }
  27.  
  28.  
  29. function __set($propertyName, $value) {
  30. if (!array_key_exists($propertyName, $this->propertyTable))
  31. throw new Exception('Błędna własność '. $propertyName.' !');
  32.  
  33. if (method_exists($this, 'set' , $propertyName)) {
  34. return call_user_func(array($this, 'set' , $propertyName), $value);
  35. }
  36. else { 
  37. if ($this->propertyTable[$propertyName] != $value &&
  38.  !in_array($propertyName, $this->changedProperties)) {
  39.  $this->changedProperties[] = $propertyName;
  40. }
  41.  
  42. $this_>data[$this->propertyTable[$propertyName]] = $value;
  43. }
  44. }
  45.  
  46. function validate() {
  47.  
  48. }
  49. }
  50. ?>


I teraz ten kod gdzie podejrzewam, że jest błąd..

  1. <?php
  2. reguire_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. $this->propertyTable['addressid'] = 'adres_id';
  12. $this->propertyTable['id'] = 'adres_id';
  13. $this->propertyTable['entityid'] = 'jednostka_id';
  14. $this->propertyTable['address1'] = 'sadres1';
  15. $this->propertyTable['address2'] = 'sadres2';
  16. $this->propertyTable['city'] = 'smiasto';
  17. $this->propertyTable['zipcode'] = 'skod';
  18. $this->propertyTable['type'] = 'styp';
  19. }
  20.  
  21.  
  22.  function validate () {
  23.  
  24.  if (strlen($this->zipcode) != 6) {
  25.  $this->errors['zipcode'] = 'Należy podać poprawny kod pocztowy.';
  26.  } 
  27.  
  28.  if ($this->address1) {
  29.  $this->errors['address1'] = 'Adres to pole wymagane';
  30.  } 
  31.  
  32.  if ($this->city) {
  33.  $this->errors['city'] = 'Miasto to pole wymagane';
  34.  } 
  35.  
  36.  if (sizeof($this->errors)) {
  37.  return false;
  38.  } else {
  39.  return true;
  40.  }
  41.  
  42.  }
  43. }
  44. ?>


Wydaje mi się, że błąd jest w metodzie validate(). Autor odwołuje suię w ten sposób
  1. <?php
  2. if ($this->address1) {
  3.  $this->errors['address1'] = 'Adres to pole wymagane';
  4.  }
  5. ?>


a powinno być chyba
  1. <?php
  2. if ($this->propertyTable['address1']) {
  3.  $this->errors['address1'] = 'Adres to pole wymagane';
  4.  }
  5. ?>


jeśli nie to dlaczego właśnie tak?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Powinno być
  1. <?php
  2. method_exists($this, 'get' . $propertyName)
  3. ?>

Pierwszy argument to instancja klasy. Drugi argument ('get' . $propertyName) to nazwa metody. Nie widzę nic dziwnego w tym wywołaniu...

Dalej...
  1. <?php
  2. call_user_func(array($this, 'get' . $propertyName));
  3. ?>

Tak samo... Pierwszy argument ma być typu callback. Jest to nazwa funkcji albo w przypadku wywoływania metod tablica. Pierwszy elementem tablicy jest referencja do obiektu (albo nazwa klasy, jeżeli wywołujemy statyczną metodę). Drugi element to nazwa metody.

Oni to zrobili po to, aby przeciążyć "magiczne" metody, ale nie tracić zachowania metod programisty getXXX... Jeżeli istnieje metoda getWlasciwosc, a ty poprosisz o dane tak:
  1. <?php
  2. echo $obj->wlasciwosc;
  3. ?>

To i tak efektem będzie wywołanie metody getWlasciwosc...
Go to the top of the page
+Quote Post
Jarod
post
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

Ostrzeżenie: (0%)
-----


Cytat(Ludvik @ 17.08.2006, 09:27 ) *
Powinno być
  1. <?php
  2. method_exists($this, 'get' . $propertyName)
  3. ?>

Pierwszy argument to instancja klasy. Drugi argument ('get' . $propertyName) to nazwa metody. Nie widzę nic dziwnego w tym wywołaniu...

$this nie jest instancją klasy(?) getNazwaMetody samo w sobie nie jest dziwne. Dziwne jest to, że w przykładzie, który podałem na samym początku nie ma metody. Jest tylko magiczna (czyli jak dobrze przeczytałem wywoływana automatycznie gdy ktoś chce wywołać nieistniejącą metode), nie ma żadnej innej metody.


Cytat(Ludvik @ 17.08.2006, 09:27 ) *
Dalej...
  1. <?php
  2. call_user_func(array($this, 'get' . $propertyName));
  3. ?>

Tak samo... Pierwszy argument ma być typu callback. Jest to nazwa funkcji albo w przypadku wywoływania metod tablica. Pierwszy elementem tablicy jest referencja do obiektu (albo nazwa klasy, jeżeli wywołujemy statyczną metodę). Drugi element to nazwa metody.

Oni to zrobili po to, aby przeciążyć "magiczne" metody, ale nie tracić zachowania metod programisty getXXX... Jeżeli istnieje metoda getWlasciwosc, a ty poprosisz o dane tak:
  1. <?php
  2. echo $obj->wlasciwosc;
  3. ?>

To i tak efektem będzie wywołanie metody getWlasciwosc...


Thx.
Go to the top of the page
+Quote Post

Posty w temacie
- J4r0d   Prośba o sprawdzenie klasy   16.08.2006, 09:37:12
- - envp   Zauważ, że masz funkcje __get() oraz __set() - pie...   16.08.2006, 11:26:57
- - Ludvik   Nie podoba mi się ten kod. Po pierwsze właściwość ...   16.08.2006, 14:29:31
|- - J4r0d   Cytat(Ludvik @ 16.08.2006, 13:29 ) Nie po...   17.08.2006, 09:35:12
- - Ludvik   Przepisałeś błędnie niektóre wywołania metod. Zami...   17.08.2006, 09:58:06
|- - J4r0d   Cytat(Ludvik @ 17.08.2006, 08:58 ) Przepi...   17.08.2006, 10:07:49
- - Ludvik   Powinno być [PHP] pobierz, plaintext <?phpmetho...   17.08.2006, 10:27:55
|- - J4r0d   Cytat(Ludvik @ 17.08.2006, 09:27 ) Powinn...   17.08.2006, 19:36:35
- - Ludvik   $this jest referencją do obiektu, którego met...   17.08.2006, 20:50:09
- - J4r0d   Analizuje ten przykład jeszcze raz i mam wrażenie,...   21.08.2006, 10:54:55
- - Ludvik   Tak też może być. Autor klasy zakładał, że nawet w...   21.08.2006, 11:15:47
|- - J4r0d   Cytat(Ludvik @ 21.08.2006, 10:15 ) Tak te...   21.08.2006, 16:49:32
- - Ludvik   CytatPo co? Jak istnieje metoda to ją wykonujesz a...   21.08.2006, 17:57:31
|- - J4r0d   Cytat(Ludvik @ 21.08.2006, 16:57 ) Nie od...   21.08.2006, 18:08:50
- - Ludvik   Mylisz się. Przeanalizuj dobrze kod. Żeby wywołać ...   21.08.2006, 19:12:02
|- - J4r0d   Cytat(Ludvik @ 21.08.2006, 18:12 ) Czyli ...   21.08.2006, 19:38:06
- - Ludvik   CytatOk - zgadza się. Ale skąd wiesz, że metoda do...   21.08.2006, 19:46:59
- - J4r0d   Cytat(Ludvik @ 21.08.2006, 18:46 ) (..)a ...   21.08.2006, 21:11:39


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 28.12.2025 - 17:11