Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mały problem z dziedziczeniem
kaem
post
Post #1





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Jestem nowym użytkownikiem na forum, więc może na początek się przywitam. A więc witam snitch.gif Niedawno zacząłem się uczyć PHP i napotkałem na taki oto problem: otóż mam dwie klasy, jedna dziedzicząca
CODE

class A
{
private $a1;
//...
}
class B extends A
{
var $a2;
//...
}

Potem wpisuje taki oto kod:
CODE

$b=new B();
$b->a1=11;
echo "$b->a1;";

I normalnie wyświetla mi wartość zmiennej $a1 równą 11, a przecież, z tego co wyczytałem klasa dziedzicząca nie powinna dziedziczyć pól prywatnych dry.gif Nie powinno tu być jakiegoś błędu?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
revyag
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 258
Pomógł: 16
Dołączył: 21.09.2004
Skąd: Kielce

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


A co masz w tej klasie ? To wygląda na jakby była wywoływana metoda magiczna __set, która tworzy dynamicznie pole klasy.
Poza tym jawnie nie przypiszesz wartości zmiennej prywatnej poza klasą więc z klasą rodzicem nie ma to wiele wspólnego.


--------------------
-------------

------
Go to the top of the page
+Quote Post
kaem
post
Post #3





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Właśnie chodzi mi o to, że to przypisanie nie powinno być możliwe, bo przecież $a1 jest prywatne, czyli klasa B tego pola nie dziedziczy. A jednak $b->a1=11 wykonuje to przypisanie i wyświetla tą wartość. Nie rozumiem dlaczego tak się dzieje i nie wyświetla błędu sad.gif Jeśli chodz o funkcje __set to z tego co się zorientowałem to ustawia ona wartość pola klasy, a nie tworzy je dynamicznie. Czy nie? dry.gif
Go to the top of the page
+Quote Post
revyag
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 258
Pomógł: 16
Dołączył: 21.09.2004
Skąd: Kielce

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


Napisałem przecież żebyś pokazał jak wygląda kod klasy B


--------------------
-------------

------
Go to the top of the page
+Quote Post
kaem
post
Post #5





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Gdyby w tej klasie było coś istotnego mogącego wpłynąć na rozwiązanie mojego problemu to bym wrzucił. Nie chce zaśmiecać. To bez sensu, ale dobra, wrzucę kod:
Kod
<?php
class A
{
     private $a1;
     private function op1()
     {
         //echo "Op1: $this->a1
";
         echo "Op A prywatna
";
     }
}
class B extends A
{
     var $a2;
     function  op2()
     {
         echo 'Op2 B
';
     }
}
$b=new B();
$b->a1=11;
echo "$b->a1;";
?>

Jak widać nic ciekawego.

Ten post edytował kaem 29.06.2008, 15:18:54
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #6





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

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


W koncu konkretny kod ktory mozna uruchomic.
Wiec tak:
- Klasa B nie posiada zadeklarowanej wlasciwosci a1 [jest ona tylko w klasie A]
- widocznie php zezwala na ustawianie zmiennych bez ich deklaracji [nie korzystam z tego wiec nie wiedzialem smile.gif] wiec $b->a1 to nie jest to samo co $a1 z klasy A [sproboj $a = new A(); $a->a1 = 'cos'; dostaniesz blad]

  1. <?php
  2. class A
  3. {
  4. private $a1;
  5. public function op1()
  6. {
  7. echo "Op1: " . $this->a1 . '<br />';
  8. //echo "Op A prywatna";
  9. }
  10.  
  11.  
  12. }
  13. class B extends A
  14. {
  15. var $a2;
  16. function op2()
  17. {
  18. echo 'Op2 B';
  19. }
  20. function op3()
  21. {
  22. echo "Op3: " . $this->a1 . '<br />';
  23. }
  24. }
  25. $b=new B();
  26. $b->a1=11;
  27. $b->samolot = "i co?";
  28. $b->op1(); // metoda klasy A, dostep do $a1 z A
  29. $b->op3(); // to samo ale z klasy B
  30. echo "VAL: " . $b->a1;
  31. ?>


Kod
Op1:
Op3: 11
VAL: 11


Ten post edytował dr_bonzo 29.06.2008, 16:00:04


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
kaem
post
Post #7





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Hmm, no to rzeczywiście wygląda jakby PHP ustawiał te zmienne mimo, że nie były zadeklarowane:|
To trochę dziwna właściwość nawet jak na PHP. Dzięki za odp.
PS. Jakiś pomysł jak zrobić, żeby móc się odwoływać w obiekcie tylko do zadeklarowanych w danej klasie pól ?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





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

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


__set() + rzucanie wyjatku


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
kaem
post
Post #9





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Ok, dzięki wielkie. Przejrzę sobie co nieco o tych wyjątkach i medodach __set i __get i coś zaimplementuje. Pzdr

Ten post edytował kaem 29.06.2008, 18:20:21
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #10





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

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


Ewentualnie w __set() mozesz po prostu nic nie robic, zamiast rzucac wyjatka - wszystko zalezy co chcesz osiagnac smile.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
kaem
post
Post #11





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Tak jak na początku napisałem, php'a zacząłem uczyć się niedawno i obecnie uczę się z książki rolleyes.gif Narazie niec konkretnego nie robię. Staram się ciekawsze fragmenty dokładniej zbadać i przetestować różne wariacje aarambo.gif Lepiej chyba teraz na etapie nauki dociec dlaczego coś tak działa a nie inaczej, niż potem tracić czas i nerwy przy pisaniu konkretnych projektów albo co gorsza już w pracy cool.gif W sumie sama nauka też potrafi dać nieźle po du...e biggrin.gif
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #12





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Dlaczego w klasie B masz var? Przecież to kod PHP4, a nie PHP5, albo używasz public/protected/private, albo cofasz się i używasz tylko var.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
kaem
post
Post #13





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


Jeśli chce się używać modyfikatorów dostępu to wpisujemy public/protected/private ale już bez var. Bez tych modyfikatorów przed zmienną musi być var. Ja tak się uczyłem. U mnie jeśli nie poprzedze zmiennej varem to wywala mi następujący błąd:
CODE
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\6\index2.php
on line 14

Oczywiście używam php 5.


Ten post edytował kaem 30.06.2008, 11:13:01
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #14





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@kaem
Ty nie rozumiesz, var to było w PHP4, odpowiednikiem tego w PHP5 jest public (a dodatkowo masz jeszcze dwa w PHP5)


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
kaem
post
Post #15





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


No ok, pytam bo uczę się teraz z książki niby już z wydaniem pod PHP 5 i tam jeszcze używają w klasach var. Teraz będę już pisał public. thx
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #16





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


http://www.php.net/manual/en/language.oop5.visibility.php
Rzuć okiem na "Note".
Z książkami jest taki kłopot, że czasem autorzy też niewiele wiedzą, albo co gorsza powtarzają to samo z PHP4, pisząc że to 5...
Ogólnie polecam korzystanie z wielu źródeł, bo co programista to inaczej to wygląda. Czytać i składać wszystko w całość.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
kaem
post
Post #17





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

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


A no właśnie. Ja już używam PHP ver. 5.2.6 i dlatego nie miałem żadnego ostrzeżenia. Myślałem, że wszystko jest git rolleyes.gif Racja - nie ufać tylko jednemu podręcznikowi

Ten post edytował kaem 30.06.2008, 13:00:47
Go to the top of the page
+Quote Post
Heweliusz
post
Post #18





Grupa: Zarejestrowani
Postów: 46
Pomógł: 8
Dołączył: 19.03.2007
Skąd: z nad Jarugi

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


Jeżeli można, chciałbym podpiąć się do tematu, mam problem odwrotny, tzn. mam klasę user, która dziedziczy po klasie session. W klasie user korzystam z właściwości klasy session, lecz mimo iż jest ona publiczna, dla klasy user jest pusta...
session.php
  1. <?php
  2. class session
  3. {
  4. public $data = array();
  5. public $session_id = '';
  6. public $session_ip = '';
  7. public $session_start_time = '';
  8. public $session_expire_time = '';
  9. public $session_user_id = 1;
  10. ?>

Chodzi o zmienną $data, domyślnie deklaruję ją jako pustą tablicę, potem w klasie session wstawiam tam dane z bazy danych.
Natomiast, chciałbym wykorzystać tą zmienną w klasie user, która dziedziczy od session.
session.php (obie są w tym samym pliku)
  1. <?php
  2. class user extends session
  3. {
  4. public $language = array();
  5. public $style_name;
  6. public $lang_path;
  7. public $style_path;
  8.  
  9. function install()
  10. {
  11. global $db, $smarty, $root_path;
  12.  
  13. if ($this->data['user_id'] != 1)
  14. {
  15. $this->style_name = $this->data['user_style'];
  16. $this->style_path = $root_path . 'styles/' . $this->style_name;
  17. }
  18. else
  19. {
  20. $this->style_name = 'default';
  21. $this->style_path = $root_path . 'styles/' . $this->style_name;
  22. }
  23. ?>

Parser zgłasza błąd poziomu notice, iż index w tablicy data nie istnieje, sprawdzałem to i okazało się że jest pusta.
Moja wersja php: 5.2.5


--------------------
Aktualny projekt: Nauka OOP :)
Go to the top of the page
+Quote Post
kwiateusz
post
Post #19


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




j.w. byl juz temat o tym ze dziedziczenie ma byc logiczne, a nie po to bo Ci jakies metody z innej klasy potrzeba... jak Ci potrzeba jej metod to przekaz sobie w konstruktorze, singletonem gdzieś w srodku albo co innego tylko broń Boże przed bezsensownym dziedziczeniem...
Go to the top of the page
+Quote Post
manro
post
Post #20





Grupa: Zarejestrowani
Postów: 9
Pomógł: 3
Dołączył: 25.10.2006

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


W klasie A zmienną a1 powinieneś zadeklarować słowem kluczowym protected
co będzie oznaczało że będzie ona dziedziczona i będzie ona nadal chroniona co uniemożliwi zrobienie czegoś takiego
jak $b->a1=11;

zmienne private nie są dziedziczone dlatego też w klasie B nie istnieje zmienna $a1
w momencie gdy wykonujesz $b->a1=11; metoda __set automatycznie tworzy taką zmienną
i nadaje jej status publiczny możesz to zablokować zmieniając metodę __set w taki sposób
aby uniemożliwiała tworzenie zmiennych które nie są zadeklarowane w klasie
Kod
<?php
class A
{
     protected $a1;
     private function op1()
     {
         //echo "Op1: $this->a1";
         echo "Op A prywatna";
     }
}

class B extends A
{
     public function  op2()
     {
         echo 'Op2 B';
     }
}

$b=new B();
$b->a1=11;
echo "$b->a1";
?>

Co do pytania które zostało podpięte do tematu to polecam jeszcze raz przeczytać sobie co to jest dziedziczenie,
bo widzę tutaj kompletny brak zrozumienia tematu...

Ten post edytował manro 24.07.2008, 22:24:17


--------------------
If you don't have time to do it right, where are you going to find the time to do it over?
http://www.nowicki.cjb.net
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 18:26