Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 70 Pomógł: 0 Dołączył: 21.04.2006 Ostrzeżenie: (0%)
|
|
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%)
|
W żadnym języku tak nie można.
I bardzo dobrze. Bo niby jak stworzysz taki obiekt? A co jak zapomnisz ndać wartosć dla test::$a? Pola klasy mogę mieć domyślnie tylko przypisanie wartości. Możesz to zrobić tak:
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%)
|
Moim skromnym zdaniem definiowanie wartosci wlasciwosci poza metodami powinno byc dopuszczalne jedynie dla wlasciwosci statycznych. W przypadku wlasciwosci niestatycznych, poza metodami powinno sie je tylko deklarowac, natomiast konkretne wartosci powinno sie im nadawac w konstruktorze lub innej metodzie.
|
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
A co, jeśli będę chciał mieć tak:
Może niezbyt uzyteczny przykład (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , ale w zasadzie jest uzasadnione przypisanie wartości przy deklaracji czy nie? |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%)
|
@Cysiaczek, ale po co skoro zmienne nie istnieja dopuki nie utworzysz obiektu, a jak tworzysz obiekt to pierwsze co robisz to ustawiasz wartosc zadeklarowanej wlasciwosci?
|
|
|
|
Post
#6
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Tutaj się zgadzamy. Tak można zrobić i nawet jest to lepiej widziane. Zastanawia mnie jednak, co się staie, jeśli usuniemy z klasy konstruktor? Takie klasy zdarzają sie dość często. Albo mam jeszcze inny przykład:
Co zrobisz z implementacją klasy abstrakcyjnej, gdzie np. w abstrakcyjnej ustalasz sobie jakąś wartość dla składowej? Ehh. Ten upiorny relatywizm :| Nic stałego (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%)
|
1. Dlaczego mialbym usuwac konstruktor z klasy skoro juz w niej jest?
2. Czy w klasie abstrakcyjnej nie mozna stworzyc konstruktora? |
|
|
|
Post
#8
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Ad1. Chodzi o klasy, w których nie deklarujesz konstruktora
Ad2. Trzeba wywołać go ręcznie z pochodnej (i to najlepiej w konstruktorze [patrz wyżej]) (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
|
Post
#9
|
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%)
|
Ad1. Chodzi o klasy, w których nie deklarujesz konstruktora No ale to kiepski przykład.Konstruktor zawsze powinno się pisać, więc po co wspominasz o klasach bez niego? Nie twierdze jednak, że nie powinno się ustawiać wartości dla pól, tutaj akurat nie podzielam zdania ~bigZbiga |
|
|
|
Post
#10
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
OOpsssaaa. Pomyłka (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) (IMG:http://forum.php.pl/style_emoticons/default/blink.gif) (IMG:http://forum.php.pl/style_emoticons/default/ohmy.gif)
Jak się nie zdefiniuje konstruktora w pochodnej, to z bazowej jest przecież wywoływany automatycznie. (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Dalej jednak jest problem ze składowymi, które trzeba jakoś zainicjować na poczatku, a nie mozna zrobić tego w klasie bazowej w konstruktorze, a nie ma konstruktora w pochodnej. (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif) Aha. W jakimś topiku pisałem na temat prywatnego konstruktora. Już mam kontekst (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Napiszę tutaj, bo częsciowo temat pasuje.
...A teraz usuńcie cały konstruktor z klasy pochodnej i juz error gotowy :| Ten post edytował Cysiaczek 11.07.2006, 08:44:54 |
|
|
|
Post
#11
|
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
Udało Ci się wywołać prywatny konstruktor z konstruktora klasy pochodnej? Jeżeli testowałeś ten kod, to wypadało by raczej zgłosić to jako błąd do ekipy od php. A tak na marginesie, przy usunięciu konstruktora z klasy pochodnej powinien chyba zostać utworzony automatycznie pusty? Czy może się mylę?
Poza tym normalni programiści nie robią takich rzeczy. Myślisz o sytuacjach, które nigdy nie będą miały miejsca przy pisaniu kodu przez cywilizowanych ludzi. Ja zwykle poza konstruktorem nadaję atrybutom wartości takie jak pusta tablica czy ciąg znaków. Tak czy inaczej, w konstruktorze je nadpisuję, jeżeli jest taka potrzeba. |
|
|
|
Post
#12
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Mam taka książkę "PHP5 Obiekty, wzorce, narzędzia" . Nie będę cytował, ale:
Jest napisane, że jeśli w klasie pochodnej deklarujesz konstruktor, to musisz wziąść odpowiedzialność za ręczne wywołanie konstruktora klasy bazowej, bo inaczej możesz otrzymać nie dokońca skonstruowany obiekt (jeśli istnieje i właśnie przez parent::__construct(wsio co trzeba tu)). Jeśli nie dasz konstruktora w klasie pochoden, to jest automatycznie wywoływany konstruktor klasy bazowej jako GŁÓWNY. Teraz zonk jest właśnie z tą widzialnością, ale to każdy może sobie sam zobaczyć uruchamiając powyższy przykład. Jeśłi chodzi o moje ucywilizowanie... (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) to chyba nigdy nie nastapi (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif) |
|
|
|
Post
#13
|
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
No jasne, działanie konstruktorów znam, ale nie w tym rzecz. Zwróciłem uwagę na to, że wywołujesz z klasy pochodnej konstruktor klasy bazowej, który został zadeklarowany jako prywatny, czyli nie jest widzialny przez klasę dziedziczącą. Gdyby był chroniony, to inna sprawa...
|
|
|
|
Post
#14
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Też mnie to zdziwiło, ale to niekoniecznie jest bład php, bo w końcu wywołujesz przez '::', a więc może idzie jako statyczne wywołanie? Znalazłem podobnego buga dot. wywołania dziedziczącego Singletona na php.net . Ponoć naprawili.:| Właściwie to mi taki "bug" nie przeszkadza (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Zresztą... nie znam się aż tak dobrze.
Jak ktoś ma pomysł co zrobic z tym fantem, to niech napisze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
Post
#15
|
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
Konstruktor nie może być wywołany statycznie. Sama jego natura wymaga obiektu, żeby móc przy nim operować. Taka składnia to pomysł twórców języka. W javie jest referencja do przodka...
Błędy raczej powinny przeszkadzać (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ten akurat pozwala na ominięcie jednej z ważniejszych rzeczy w oop. Wystarczy zmienić modyfikator na protected i po sprawie. A jeżeli wtedy usuniemy konstruktor z pochodnej, to juz nasz problem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
Post
#16
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
No własnie nie. protected jest ok - widac go w pochodnych zawsze. Mnie zastanawia, czy własnie uzycie
parent::__construct(); nie jest tutaj kluczowe i dozwolone ze względu na konieczność skonstruowania obiektu - tzn jest konstruktor klasy pochodnej, więc obiekt musi sie pojawić. To, że jest konstruktor w bazowej i jest wykonany jest implikowane przez publiczny konstruktor pochodnej. ehh. 1. sprawdze jeszcze dla zwykłego dziedziczenia. <--sprawdzone - działa 2. wywołanie w pochodnej przez parent::__construct w publicznej metodzie innej niż konstruktor wywołuje spodziewany bład. Ten post edytował Cysiaczek 11.07.2006, 10:22:58 |
|
|
|
Post
#17
|
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
W tym wypadku nie ma prawa wystąpić jakiegolwiek odstępstwo od reguły. Prywatny znaczy prywatny, a nie chroniony - zawsze. Kontruktory trzeba tworzyć z głową. Przecież prywatny konstruktor, inicjujący zmienne publiczne/chronione danej klasy jest całkowicie bez sensu... Chroniony może już się tym zająć, bo nie zostawi syfu w zmiennych.
|
|
|
|
Post
#18
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
W zasadzie, to jak robisz konstruktor w klasie bazowej, to chyba chcesz, żeby został wywołany? Może właśnie to konstruktor klasy bazowej musi być zawsze publiczny, żeby prawidłowo zainicjowac obiekt, bo co Ci po kawałku obiektu? Poczytam na php.net w bug rapartach i zobaczę, czy cos tam mają wiecej na ten temat. Do manuala to mozna teraz mieć pretensje, bo bardzo po macoszemu traktuje konstruktory :|
|
|
|
|
Post
#19
|
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%)
|
Uwazam ze wlasciwosci predefiniowane niestatyczne nie powinno sie ustawiac poza konstruktorem bo:
Istnieja tylko kiedy istnieje obiekt, a obiekt jest tworzony przez konstruktor zatem konstruktor powinien im nadawac te wartosci nawet jesli wszystkie instancje tej samej klasy maja miec poczatkowo te sama wartosc tej samej wlasciwosci. Jest to moim zdaniem logiczne i intuicyjne. W Action Scripcie np. przypisanie wartosci do wlasciwosci przy jej inicjalizacji automatycznie traktowane jest jak wlasciwosci statyczne. Oczywiscie mowie tu o pisaniu klas, a nie prototypow. |
|
|
|
Post
#20
|
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%)
|
Konstruktor nie musi być publiczny. Prywatne konstruktory przydają się przy implementacji wzorca singleton. Co mi po kawałku obiektu? Hmmm... a co mi po kimś, kto tak pisze klasy, że nie inicjuje wszystkich zmiennych? Przy programowaniu trzeba myśleć, tak jak przy wielu innych rzeczach. Żaden język nie jest odporny na niedouczonych programistów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
![]() ![]() |
|
Aktualny czas: 19.12.2025 - 13:54 |