![]() |
![]() |
![]()
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 ![]() |
Jak najbardziej masz rację Crozin. To nie zmienia niczego jeśli chodzi o efekt i złego nic nie czyni, ale to już napisałem ciut wyżej w poście. Tutaj chodzi bardziej o trzymanie się paradygmatów OOP. Php pozwala je nieco nagiąć i robi to w sposób dający pewną wygodę. To ile parametrów ostatecznie trafi do konstruktora to akurat drobiazg jak sam wiesz. To co moim zdaniem jest problemem w takim wypadku to "zgubienie" od strony usera "przejrzystości". Czemu? Sam popatrz... Jeśli coś ustawiam domyślnie w klasie to i tak muszę to udostępnić do zmiany w konstruktorze lub kolejnej metodzie klasy. Innymi słowy mam sytuację:
a) mam takie coś jak ja używam i widzę po konstruktorze co jest wymagane, a co opcjonalne (wartości domyślne) b) ustawiam w klasie wartości domyślne, a konstruktor i tak musi mieć tę samą listę argumentów co w a) by można było je jakoś ustawić w przypadku użycia czegoś innego niż defaultowe wartości. Tutaj nie da się zrobić "na skróty" nic, ponieważ musisz dać użytkownikowi możliwość "w jakiś sposób" i tak zmienić te wartości. c) mamy krótki konstruktor bez parametrów domyślnych, ale musimy sami zadbać o kolejne metody zmiany tych własności, gdy trzeba użyć wartości innych niż domyślne. Innymi słowy zamiast samego konstruktora kończymy z konstruktorem i nadmiarowymi metodami do obsługi własności z ustawionym default. Jaki z tego wniosek? Ustawianie wartości w klasie powoduje: a) bez znajomości wnętrza klasy gubimy informację o tym co jest opcjonalne, a co nie. b) musimy pisać nadmiarowy kod, gdyż i tak musimy dać możliwość zmiany tych parametrów na wypadek gdyby trzeba ustawić własności inaczej niż domyślnie. Albo więc kod jest identyczny jak w przypadku mojego podejścia, tylko że masz w klasie dodatkowo na sztywno już je ustawione (a nie w parametrach), albo piszesz dodatkowo nadprogramowe metody poza konstruktorem lub kombinujesz na inne sposoby jak je ustawiać. Jak widzisz to co uważasz za "fajne" jest mniej "elastyczne" jak i kończyć się może pisaniem nadprogramowego kodu by obsługiwać sytuacje, gdy ktoś zmienia parametry domyślne. Jak widzisz, paradoksalnie to co uważasz za wygodniejsze, nie jest do końca takie idealne w ostatecznym rozrachunku. W idealnym przypadku moje i Twoje podejście to tylko wspomniane przez Ciebie "przeniesienie" nadania wartości z definicji klasy do listy parametrów, ale już to owocuje tym, co wspomniałem w podpunkcie a) i sprawia, że generując choćby API sobie, musisz dodatkowo pisać, które z parametrów są defaultowe, ponieważ tak sobie zdefiniowałeś we wnętrzu klasy. W moim podejściu masz to jak na dłoni. Jeśli projekt jest duży to niestety użycie generatora, który po prostu zrzuca nagłówki funkcji nic nie powie, a dodatkowo musisz w phpDoc czy innym generatorze dokumentacji napisać, że parametr jest domyślny z taką a taką wartością, bo generator zapewne sam tego nie wychwyci. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 20:23 |