Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]OOP Ucze się... konstruktor
cykcykacz
post
Post #1





Grupa: Zarejestrowani
Postów: 550
Pomógł: 9
Dołączył: 29.05.2009
Skąd: Ostrów Wielkopolski

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


Witam,
nie umiem ogarnąć konstruktora kiedy go używamy i po co?
Może ktoś mi wytłumaczy?
W poniższym przykładzie mamy klasę dog w której mamy publiczny dostęp do atrybutu $name oraz konstruktora.
Z tego co rozumiem konstruktor jest to metoda która w chwili powstania obiektu nadaje mu jakiś właściwości?
Ale po co i kiedy tego mam używać?
klasa
Kod
<?php
class Dog{
    public $name;//atrybut przechowujący imię psa

    /*konstruktor*/
    public function __construct($name){
        $this->name = $name;
    }
    public function roar(){
        echo 'chał chał';
    }
    //ciach
}
?>

obiekt
Kod
<?php
require('class.dog.php');
$reksio = new Dog('Reksio');
echo $reksio->name; //atrybut "name" publiczny, więc wyświetlone zostanie 'Reksio'
$reksio->roar(); //metoda roar() publiczna, więc wyświetlone zostanie 'chał chał'
?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ależ nie mieszam... Zauważ co uznaję za prawidłowe podejście:
1. Nie ustawianie w definicji klasy wartości domyślnej na sztywno - stąd odpadł Twój pierwszy przypadek
2. Nie ustawianie w konstruktorze wartości domyślnej na sztywno z powietrza by być może nie została ona potem zamieniona na inną w trakcie działania konstruktora.
3. Ustawianie wartości domyślnej w klasie podczas tworzenia obiektu poprzez konstruktor.

Właśnie dlatego jedyną dla mnie w pełni naturalną formą jest ustawianie atrybutów poprzez domyślną wartość parametru konstruktora, czyli niejako uczynienie go z automatu jego parametrem opcjonalnym. To sprawia, że klasa nie wie jak zainicjalizowany będzie obiekt, obiekt także tego nie wie, ale może to obsłużyć, ponieważ nawet w przypadku braku tego parametru z zewnątrz, ma on go ustawionego na poziomie definicji metody. Dzięki temu nie musimy ingerować zarówno w kod klasy jak i kod samej metody. Ich implementacje pozostają nienaruszone, zmienia się jedynie lista parametrów, a więc praktycznie nie ingerujemy w nic.

Dlatego nie traktuj tego co piszę jako błędu czy problemu, ale pewien "paradygmat" czy może bardziej konwencję jak maksymalnie odseparowywać pewne warstwy od siebie. W tym przypadku jak odizolować deklarację od definicji.

Zauważ, że jest różnica pomiędzy:
function metoda( $param, $param2 )
function metoda( $param = 'default1', $param2 = 'default2' )

Pierwsza zupełnie nie sugeruje tego, że wartości parametrów są domyślne, a co gorsze, wewnątrz metody musisz i tak dodatkowo ich obsługę dopisać, gdyż konieczne jest sprawdzenie czy parametry przekazano, a jeśli nie, by użyto wartości domyślnych. Rozwiązaniem tego problemu jest:
a) ustawienie wartości zanim ruszy konstruktor (czyli na poziomie definicji klasy),
(IMG:style_emoticons/default/cool.gif) napisanie konstruktora domyślnego czyli innymi słowy sięgnięcie po polimorfizm.
Jako że (IMG:style_emoticons/default/cool.gif) w PHP nie jest możliwe w znany z języków silnie typowanych sposób, to sam widzisz czemu zezwolono na "brudzenie" definicji klasy.
Go to the top of the page
+Quote Post

Posty w temacie
- cykcykacz   [PHP]OOP Ucze się... konstruktor   20.04.2011, 18:44:30
- - mat-bi   Ludzie... http://museum.webcity.pl/webcity/artyku...   20.04.2011, 19:13:59
- - cykcykacz   Już miej więcej się domyśliłem, że konstruktora uż...   20.04.2011, 19:39:27
- - thek   Ech... Konstruktor to SPECJALNA metoda, która ZAWS...   20.04.2011, 20:07:51
- - Crozin   @thek: A to niby czemu coś takiego miałoby być błę...   20.04.2011, 20:47:55
- - cykcykacz   Odbiegając od tematu ciężko się nauczyć mi osobiśc...   20.04.2011, 21:23:32
- - everth   @Crozin - błąd nie ale thek ma trochę racji, w pod...   20.04.2011, 22:07:21
- - thek   Może wyjaśnię o co mi chodzi, bo everth "widz...   21.04.2011, 09:43:35
- - Crozin   @thek: jak zwykle nie zawiódł. Ładny wywód i trzyk...   21.04.2011, 10:15:43
- - cykcykacz   Stworzyłem klasę, która łączy się z bazą oraz pobi...   21.04.2011, 19:13:02
- - mat-bi   W konstruktorze nie robimy zwykle takich rzeczy ja...   21.04.2011, 19:20:02
- - thek   Spróbuj w C/C++ tak zrobić, to kompilator Ci się n...   21.04.2011, 21:55:17
- - everth   Tak mnie naszło - czy PHP w trakcie inicjowania ob...   21.04.2011, 22:15:33
- - Crozin   @thek: A jakiś argument przeciw, ale nie bazujący ...   21.04.2011, 22:49:35
- - thek   Czy ja wiem czy takie nie domyślne? Mam klasę w Ko...   22.04.2011, 01:44:36
- - Crozin   Temat wiąże się z OOP więc proszę mi tutaj Kohany ...   22.04.2011, 10:52:30
- - thek   No nie mów, że Kohana to nie OOP? Ja rozumiem, że...   22.04.2011, 11:47:46
- - Crozin   Ale przecież oczywistym jest, że jeżeli ustalenie ...   22.04.2011, 12:38:25
- - thek   Cytatjeżeli ustalenie czegoś nie jest tak trywialn...   22.04.2011, 17:08:53
- - Crozin   Ależ Ty mącisz... Wymieszałeś prywatne sprawy obi...   22.04.2011, 17:33:02
- - thek   Ależ nie mieszam... Zauważ co uznaję za prawidłowe...   22.04.2011, 21:29:47
- - everth   [bezzwiazkuztematem] Nie wiem czy zauważyliście al...   22.04.2011, 22:11:42
- - Crozin   CytatWłaśnie dlatego jedyną dla mnie w pełni natur...   23.04.2011, 14:15:45
- - thek   Jak najbardziej masz rację Crozin. To nie zmienia ...   24.04.2011, 21:54:31
- - everth   @thek trochę masz dziwne podejście z tymi argument...   25.04.2011, 12:40:58
- - darko   ~cykcykacz kontynuujesz temat po prawie dwóch lata...   25.04.2011, 13:39:18
- - cykcykacz   ~darko faktycznie masz mnie nawet zapomniałem o t...   25.04.2011, 16:20:24
- - r4xz   no na pewno aby przyśpieszyć naukę przyda się prze...   25.04.2011, 16:39:49
- - darko   ~cykcykacz jeśli chodzi o wymagania pracodawców na...   25.04.2011, 18:08:35
- - cykcykacz   ~darko CytatMoże to, co dalej napiszę nie będzie ...   25.04.2011, 19:58:03
- - darko   Php uczyłem się 4 miesiące znając już języki: c, c...   25.04.2011, 20:13:44
- - cykcykacz   To ja dalej zasiadam do nauki PHP i nie tylko Dz...   25.04.2011, 20:28:23
- - Crozin   @thek: Uczepiłeś się jednego konkretnego przypadku...   25.04.2011, 20:57:49
- - darko   ~Crozin zgadza się, że przestrzeń globalna jest zł...   25.04.2011, 21:19:02
- - everth   Paradygmat pewnie żaden, ale czy kosmetyka? Jeśli ...   25.04.2011, 22:59:13
- - thek   @Crozin: Nie wiem czy zauważyłeś, ale to o czym ja...   26.04.2011, 02:23:29
- - Crozin   @darko: Nie wiem z jakich Ty to FW korzystasz, ale...   26.04.2011, 12:26:48
- - thek   Widać sam nie zauważyłem, że w czasie pisania skró...   26.04.2011, 12:40:37
- - everth   @thek Ciekawy art na temat umieszczania argumentów...   26.04.2011, 18:31:27
- - darko   Cytat(Crozin @ 26.04.2011, 13:26:48 )...   26.04.2011, 19:14:10
- - thek   @everth: faktycznie fajny, ale szkoda, że na wąski...   26.04.2011, 21:14:27


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: 12.10.2025 - 12:32