Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Strict Standards
likemandrake
post
Post #1





Grupa: Zarejestrowani
Postów: 175
Pomógł: 17
Dołączył: 23.06.2006

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


Witam

Mam taki mini problem, mam o to taki zestaw klas:

  1. <?php
  2. class A {
  3.   // Zestaw metod
  4. }
  5.  
  6. class B extends A {
  7.   // Dodatkowy zestaw metod
  8. }
  9.  
  10. abstract class C {
  11.   public function setObject(A $object) {
  12.      
  13.   }
  14. }
  15.  
  16. abstract class D extends class C {
  17.   public function setObject(B $object) {
  18.      
  19.   }
  20. }
  21.  
  22. class Concrete extends class D {
  23.  
  24. }
  25. ?>


Gdy działam na obiekcie klasy Concrete, php wywala mi taki komunikat:
Cytat
Strict Standards: Declaration of D::setObject() should be compatible with that of C::setObject() in [...]


Co o tym myślicie, czy nie jest to troszkę na wyrost? Wiadomo, co chciałem przez to osiągnąć... Jak do tego podejść tak w ogóle?

Pozdrawiam

Ten post edytował likemandrake 3.02.2009, 19:46:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Cytat
No właśnie, PHP mi nakazuje aby te metody były ze sobą kompatybilne, mimo tego, że nie są to metody abstrakcyjne. Stąd moje pytanie, jak do tego podejść.

W php nie ma przeciazania metod (ta sama nazwa a inne parametry) - wiec nadpisujesz metode w podklasie (zmieniasz jej implementacje), a wiec musza miec te same paramery.

Skoro ja nadpisujesz to musisz zachowac jej sygnature - typ parametru (skoro go specyfikujesz), czemu?
Z definicji OOP:
  1. <?php
  2. $c = new Concrete_C(); // extends C
  3. $c->setObject( new A() ); // OK
  4. ?>


Tworzysz sobie obiekt typu C (czyli klasy C lub pochodnych == klasy C, D, Concrete, whatever).
Zgodnie z polimorfizmem mozesz wymienic obiekt na inna podklase klasy C, i powinienes miec mozliwosc wykonywania na nim tych samych operacji,
tu: przekazania obiektu klasy A do metody setObject(), ale

  1. <?php
  2. $c = new Concrete_D(); // extends D
  3. $c->setObject( new A() ); // !!! NIE ZADZIALA, bo A nie jest B (dziedziczenie to relacja odwrotna, B jest A)
  4. ?>



Wiem ze PHP to nie Java/C# i ze jest dynamicznym jezykiem, ale po co w takim razie korzystasz z type-hintingu skoro nie chcesz sie do jego zasad dostosowac?

  1. <?php
  2. // phph 5.2.6
  3. error_reporting( E_ALL | E_STRICT );
  4.  
  5. class A {
  6.    var $x = 3;
  7.  // Zestaw metod
  8.  protected $object = null;
  9. }
  10.  
  11. class B extends A {
  12.  // Dodatkowy zestaw metod
  13. }
  14.  
  15. abstract class C {
  16.  public function setObject(A $object) {
  17.     $this->object = $object;
  18.  }
  19. }
  20.  
  21. abstract class D extends C {
  22.  public function setObject(B $object) {
  23.     $this->object = $object;    
  24.  }
  25. }
  26.  
  27. class Concrete extends D {
  28.  
  29. }
  30. class Concrete_D extends  D {
  31.  
  32. }
  33. class Concrete_C extends C {
  34.  
  35. }
  36.  
  37. $c = new Concrete_C();
  38. $c->setObject( new A() );
  39.  
  40. print_r( $c );
  41.  
  42. $c = new Concrete_D();
  43. $c->setObject( new B() );  // przyjmuje tylko B
  44. $c->setObject( new A() );  // z A nie zadziala
  45.  
  46. print_r( $c );
  47. ?>



// pomógł++
// ayeo
Go to the top of the page
+Quote Post

Posty w temacie


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: 6.10.2025 - 19:42