Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z parent::
Forum PHP.pl > Forum > Przedszkole
elnino17
Witam, napisałem sobie poniższy kawałek kodu lecz nie działa,

  1. class Dodawanie1
  2. {
  3. private $a;
  4. private $b;
  5.  
  6. public function dodaj($c, $d){
  7.  
  8. return ($this->a = $c) + ($this->b = $d);
  9.  
  10. }
  11. }
  12.  
  13. class Dodawanie2 extends Dodawanie1
  14. {
  15. private $e;
  16.  
  17.  
  18. public function dodaj2($h){
  19.  
  20. return ($this->e = $h) + (parent::dodaj($c, $d));
  21.  
  22. }
  23. }
  24.  
  25.  
  26. $liczba = new Dodawanie1;
  27. echo $liczba->dodaj(7, 5).'<br />';
  28.  
  29. $liczba2 = new Dodawanie2;
  30. echo $liczba2->dodaj2(2);


otrzymuję komunikat, że zmienne c i d nie zotały zdefiniowane, nie wiem skąd wynika ten błąd jeżeli za pomocą parenta "dostaje się" do tych zmiennych, przynajmniej tak mi się wydaje, z góry przepraszam jeżeli walnąłem jakąś totalną głupotę w kodzie.
Spawnm
Private zmień na protected lub public wink.gif
elnino17
Zmieniłem, nie działa.
Pyton_000
A gdzie Ty masz zdefiniowane te $c i $d ??Bo ja tu widzę przekazanie do funkcji dodaj() tych parametrów kolokwialnie mówiąc z dupy
Crozin
@elnino17: @Spawnm: Wygląda na to, że nie rozumiecie czym dziedziczenie jest, a czym nie jest. $liczba i $liczba2 nie mają ze sobą nic wspólnego, a zmienne $c i $d w żaden magiczny sposób nie pojawią się wewnątrz Dodawanie2::dodaj2().

1. http://en.wikipedia.org/wiki/Inheritance_(...ed_programming)
2. http://php.net/manual/en/language.oop5.inheritance.php
3. http://www.php.net/manual/en/keyword.extends.php
4. http://www.php.net/manual/en/keyword.parent.php
elnino17
Na swoją obronę mogę powiedzieć, że dopiero się uczę i sam stworzyłem sobie tego typu problem do rozwiązania wzorując się min. na tym przykładzie z dokumentacji:

  1. class BaseClass {
  2. function __construct() {
  3. print "In BaseClass constructor\n";
  4. }
  5. }
  6.  
  7. class SubClass extends BaseClass {
  8. function __construct() {
  9. parent::__construct();
  10. print "In SubClass constructor\n";
  11. }
  12. }
  13.  
  14. $obj = new BaseClass();
  15. $obj = new SubClass();


Wg mnie za pomocą parent:: "dostajemy się" konstruktora klasy BaseClass i jego wartość mamy dodatkowo w konstruktorze klsay SubClass.
ziolo
Cytat(elnino17 @ 3.07.2014, 21:53:41 ) *
Witam, napisałem sobie poniższy kawałek kodu lecz nie działa,

  1. class Dodawanie1
  2. {
  3. private $a;
  4. private $b;
  5.  
  6. public function dodaj($c, $d){
  7.  
  8. return ($this->a = $c) + ($this->b = $d);
  9.  
  10. }
  11. }
  12.  
  13. class Dodawanie2 extends Dodawanie1
  14. {
  15. private $e;
  16.  
  17.  
  18. public function dodaj2($h){
  19.  
  20. return ($this->e = $h) + (parent::dodaj($c, $d));
  21.  
  22. }
  23. }
  24.  
  25.  
  26. $liczba = new Dodawanie1;
  27. echo $liczba->dodaj(7, 5).'<br />';
  28.  
  29. $liczba2 = new Dodawanie2;
  30. echo $liczba2->dodaj2(2);


otrzymuję komunikat, że zmienne c i d nie zotały zdefiniowane, nie wiem skąd wynika ten błąd jeżeli za pomocą parenta "dostaje się" do tych zmiennych, przynajmniej tak mi się wydaje, z góry przepraszam jeżeli walnąłem jakąś totalną głupotę w kodzie.


Ale jak sie dostajesz do tych zmiennych ($c,$d)to są tylko argumenty funkcji nie mające nic wspólnego z klasą

  1. class Dodawanie2 extends Dodawanie1
  2. {
  3. private $e;
  4.  
  5.  
  6. public function dodaj2($h){
  7.  
  8. return ($this->e = $h) + ($this->dodaj($this->a, $this->b));
  9.  
  10. }
  11. }


To zadziała tylko jak pisał Spawnm - daj protected dla $a i $b w klasie nadrzędnej.

parent:: - uzywaj jak zmieniasz funkcje - taka sama nazwa w klasie nadrzednej i podrzednej.
by_ikar
Jeżeli twoim zamierzeniem było otrzymać wynik z pierwszego dodawania, następnie w drugim dodawaniu dodać do pierwszego wyniku nową wartość, to tak ci to nie zadziała, dlatego że są to dwie różne instancje. Albo operujesz na jednej instancji, albo robisz to jakoś bardziej sensownie w stylu przekazywania wyniku z pierwszego dodawania do nowego obiektu. Tyle że w drugim przypadku dziedziczenie nie ma raczej sensu.
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.