Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obiekty a zmienne
slash12345
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 21.04.2006

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


Witam,
Mam taką klasę w php:
  1. <?php
  2. class test{
  3. public $a = 0;
  4. public $b = $a;
  5. }
  6. ?>

Przy próbie uruchomienia, skrypt zgłasza błąd. Jak więc mogę przypisać wartość jednej zmiennej do drugiej?
Czyżby twórcy php zapomnieli o tym drobnym szczególe?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
mike
post
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:
  1. <?php
  2.  
  3. class test {
  4. public $a = 0;
  5. public $b;
  6.  
  7. public function __construct()
  8. {
  9. $this->b = $this->a;
  10. }
  11. }
  12.  
  13. ?>
Go to the top of the page
+Quote Post
bigZbig
post
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.
Go to the top of the page
+Quote Post
Cysiaczek
post
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:
  1. <?php
  2. class cysio{
  3.  
  4. public $path='/ble/ble/ble/';
  5.  
  6. public function __construct(){
  7. $data=file_get_conte ... //bierzemy coś z pliku
  8. $this->path='/ble/ble/ble/kolejne/ble/';
  9.  
  10. }
  11.  
  12. }
  13. ?>



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

  1. <?php
  2. class cysio{
  3. public $path;
  4.  
  5. public function __construct(){
  6. $this->path = '/ble/ble/ble/';
  7. $data=file_get_conte ... //bierzemy coś z pliku
  8. $this->path = '/ble/ble/ble/kolejne/ble/';
  9. }
  10. }
  11. ?>
Go to the top of the page
+Quote Post
Cysiaczek
post
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)
Go to the top of the page
+Quote Post
bigZbig
post
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?
Go to the top of the page
+Quote Post
Cysiaczek
post
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)
Go to the top of the page
+Quote Post
mike
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Cysiaczek @ 11.07.2006, 09:18 ) *
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
Go to the top of the page
+Quote Post
Cysiaczek
post
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.
  1. <?php
  2. abstract class CoolPeople{
  3.  
  4. private function __construct(){
  5. print 'jestem bazowy';
  6. }
  7.  
  8. abstract function beCool();
  9. }
  10.  
  11. class cysio extends CoolPeople{
  12.  
  13. public function __construct(){
  14. parent::__construct();
  15. }
  16.  
  17. function beCool(){}
  18. }
  19.  
  20. $ob=new cysio;
  21. ?>


...A teraz usuńcie cały konstruktor z klasy pochodnej i juz error gotowy :|

Ten post edytował Cysiaczek 11.07.2006, 08:44:54
Go to the top of the page
+Quote Post
Ludvik
post
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.
Go to the top of the page
+Quote Post
Cysiaczek
post
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)
Go to the top of the page
+Quote Post
Ludvik
post
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...
Go to the top of the page
+Quote Post
Cysiaczek
post
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)
Go to the top of the page
+Quote Post
Ludvik
post
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)
Go to the top of the page
+Quote Post
Cysiaczek
post
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
Go to the top of the page
+Quote Post
Ludvik
post
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.
Go to the top of the page
+Quote Post
Cysiaczek
post
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 :|
Go to the top of the page
+Quote Post
bigZbig
post
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.
Go to the top of the page
+Quote Post
Ludvik
post
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)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 19.12.2025 - 13:54