![]() |
![]() |
![]()
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ł' ?> |
|
|
![]() |
![]()
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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 12.10.2025 - 12:32 |