Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem z parent::
elnino17
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 2.10.2012

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Private zmień na protected lub public (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
elnino17
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 2.10.2012

Ostrzeżenie: (10%)
X----


Zmieniłem, nie działa.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@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
Powód edycji: [Spawnm]: mea culpa, nie wczytałem się w kod xd
Go to the top of the page
+Quote Post
elnino17
post
Post #6





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 2.10.2012

Ostrzeżenie: (10%)
X----


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.

Ten post edytował elnino17 3.07.2014, 21:45:37
Go to the top of the page
+Quote Post
ziolo
post
Post #7





Grupa: Zarejestrowani
Postów: 82
Pomógł: 20
Dołączył: 17.01.2009
Skąd: Kraków

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


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.

Ten post edytował ziolo 3.07.2014, 22:01:02
Go to the top of the page
+Quote Post
by_ikar
post
Post #8





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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.
Go to the top of the page
+Quote Post

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: 25.08.2025 - 14:16