![]() |
![]() |
![]()
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
![]() 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 ![]() |
|
|
![]() |
![]()
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. -------------------- -------------
------ |
|
|
![]()
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
![]() ![]() |
|
|
![]()
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
-------------------- -------------
------ |
|
|
![]()
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 |
|
|
![]()
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 ![]()
Kod Op1:
Op3: 11 VAL: 11 Ten post edytował dr_bonzo 29.06.2008, 16:00:04 -------------------- Nie lubię jednorożców.
|
|
|
![]()
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 ? |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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
![]() -------------------- Nie lubię jednorożców.
|
|
|
![]()
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
![]() ![]() ![]() ![]() |
|
|
![]()
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. |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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
|
|
|
![]()
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. |
|
|
![]()
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
![]() Ten post edytował kaem 30.06.2008, 13:00:47 |
|
|
![]()
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
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)
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 :)
|
|
|
![]()
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...
|
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 18:26 |