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%)
-----


Nie podoba mi się ten kod. Po pierwsze właściwość nie jest walidatorem, co najwyżej może być walidowana (czyli raczej Validable). Poza tym nie rozumiem, po co deklarować metodę validate, w klasie PropertyObject... Jest to typowy przykład zastosowania metody abstrakcyjnej, a nie bezsensownego wklepywania pustej...

Tak poza tym, to dlaczego my mamy to sprawdzać? Więcej się nauczysz, jak sam będziesz chciał to sprawdzić... Odpal skrypt, zdebuguj go xdebugiem czy czymś innym...
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 @ 16.08.2006, 13:29 ) *
Nie podoba mi się ten kod. Po pierwsze właściwość nie jest walidatorem, co najwyżej może być walidowana (czyli raczej Validable). Poza tym nie rozumiem, po co deklarować metodę validate, w klasie PropertyObject... Jest to typowy przykład zastosowania metody abstrakcyjnej, a nie bezsensownego wklepywania pustej...


Coraz częściej dochodze do wniosku, że ta książka jest bardzo zamotana. Chyba tylko po to, żeby więcej stron było.

Cytat(envp @ 16.08.2006, 10:26 ) *
Zauważ, że masz funkcje __get() oraz __set() - pierwsza wykorzystywana jest wtedy kiedy robisz


Ok. Powoli łapie. Ale nie mogę zrozumieć tego kawałka kodu (z metody __get() ):
  1. <?php
  2. if (method_exists($this, 'get' , $propertyName)) {
  3. return call_user_func(array($this, 'get' , $propertyName));
  4. }
  5. else { 
  6. return $this->data[$this->propertyTable[$propertyName]];
  7. ?>


Po co sprawdza się czy metoda istnieje. Nie łapie też argumentów tej metody oraz call_user_func. Czytałem o tych funkjach ale nie mogę załapać. Możecie mi to wytłumaczyć?
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 - 18:20