![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Mam pytanie czy w php5 da się przeciążyć konstruktor? Generalnie wiem, że można przeciążać dowolną funkcję za pomocą __call, ale z konstruktorem jakos mi nie wychodzi
![]() Próbowałem zarówno użyć __construct jak i NazwaKlasy przy przeciążaniu w __call i nic z tego. Czy ktos wie jak można przeciążyć konstruktor? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 312 Pomógł: 0 Dołączył: 29.12.2004 Ostrzeżenie: (0%) ![]() ![]() |
rzuć jakiś kod i napisz w jakim celu chcesz go przeciążyć.
odwoływałeś siędo niego przez self::__construct() ? -------------------- ![]() ![]() |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 416 Pomógł: 0 Dołączył: 8.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
Konstruktor przeciazasz w normalny sposob jak kazda inna metode. Tutaj przyklad:
Wynik: Kod foo foo fooEx oczywiscie parent::__construct(); jest tutaj niepotrzebny, dalem tylko zeby bylo widac ze jakikolwiek zwiazek z klasa nadrzedna istnieje. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
@ikioloak - chodzi mi raczej o przeciazenie konstruktora klasy tak aby moc go wywyolywac z roznymi parametrami (w innych jezykach to jest mozliwe nie wiem czy w php) - nie o dziedziczenie
@all Podam przyklad co mniej wiecej chce zrobic. W takim razie zalozmy ze tworze klase o nazwie cls_ogloszenie. Bedzie ona zawierala tresc ogloszenia publikowana przez usera lub odczytana z bazy. Teraz musza byc 4 rozne konstruktory: 1) Ktory tworzy ogloszenie z domyslnymi danymi. np __cosntruct() 2) Ktory tworzy ogloszenie na podstawie tablicy asocjacyjnej __construct ($tablica) 3) Ktory tworzy ogloszenie na podstawie id_ogloszenia z danych z formularza np __construct($tytul_ogloszenia, $tresc_ogloszenia itp) 4) Ktory odczytuje ogloszenie z bazy np __construct($bool_odczyt_z_bazy, $id_ogloszenia) Generalnie chodzi mi o to, ze w zaleznosci od podanej ilosci parametrow bedzie wywolywany odpowiedni konstruktor, ktory cos tam zrobi. Probowalem takim kodem to zalatwic:
Wiem ze kod jest jeszcze nie kompletny i trzeba sprawdzac dodatkowo liste parametrow, ale juz nawet w tym przypadku konstruktor jest pomijany -> dla innych funkcji wszystko dziala bez problemu Nie zabardzo rozumiem o co chodzi z tym self::construct -> gdzie nalezaloby tego uzyc? W php jestem nowy. Ten post edytował athabus 30.12.2005, 13:57:11 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 416 Pomógł: 0 Dołączył: 8.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy to jest optymalne rozwiazanie, ale dziala:
Inna opcja to jest utworzenei jednej klasy abstrakcyjnej, pozniej 4 klasy gdzie kazda implementuje na swoj sposob konstruktor, i w zaleznosci od parametrow tworzyc obiekt danej klasy. Co o tym mysilsz? |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Tez wlasnie o czym takim myslalem (pierwsze rozwiazanie). Drugie jest nawet ciekawsze
![]() Mam nadziej, ze kiedys w php wprowadza jakies fajne mechanizmy przeciazania takie jak np w C#. Jakos mam uprzedzenie do tych wszystkich if'ow i sprawdzania czy dany parametr jest tablica czy obiektem itd... troche to psuje czytelnosc kodu. Ale dzieki bardzo za ten drugi sposob - jest calkiem ciekawy: ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
w php nie można przeciążać funkcji oraz operatorów ... do c++ jeszcze mu daleko ... co do wywoływania to można w kontruktorze klasy bazowej robić tak: return $this = new klasa_z_parametrow ... to pozwala tworzyć obiekt zawsze przez $foo = new KlasaBazowa ...takie pseudo przeciążanie ... pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Cytat w php nie można przeciążać funkcji oraz operatorów ... do c++ jeszcze mu daleko ... No funkcje niby mozna przeciazac za pomoca __call($nazwa, $parametry) - ale szczerze to faktycznie nazwanie tego przeciazaniem funckji to naduzycie ![]() Ja się obiektowego programowania uczylem na C# i teraz mi tych mechanizmow brakuje w php - moze w wersji 6 rozwiaza pare kwestii. Ale moim zdaniem i tak jest o niebo lepiej niz w PHP4 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
-------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Cytat(orson @ 2005-12-30 16:14:40) co do wywoływania to można w kontruktorze klasy bazowej robić tak: return $this = new klasa_z_parametrow ... to pozwala tworzyć obiekt zawsze przez $foo = new KlasaBazowa ...takie pseudo Niestety - nic z tego. Kontruktor nie może nic zwracać. Return może zostać użyte tylko bez parametrów, w celu zakończenia działania metody. -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
to w takim razie w php5 się to zmieniło bo pod 4 używam tego w klasie dostępu do danych ... tworze w zależności od wymagań instancję klasy pochodnej mysql lub postgresa ... a właściwie to nie musi to być w returnie ... można wywalić słowo return i też powinno działać ... pozdrawiam -------------------- Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 0 Dołączył: 19.06.2007 Skąd: Gdańsk Ostrzeżenie: (10%) ![]() ![]() |
A to nie możesz stworzyć w klasie bazowej dla obu klas pochodnych (mysql, postgree), metody statycznej, która będzie zwracać odpowiedni obiekt?
Zauważ, że PEAR: ![]() Kod $a = DB::connect($dsn);
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 29.09.2008 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Można również stworzyć Fabrykę i jest to moim zdaniem najlepsze rozwiązanie dla tworzenia parametryzowanych obiektów. Rozdzielamy odpowiedzialność w czytelny i bardziej intuicyjny sposób.
CODE class Foo { public function __construct() { } } class FactoryFoo{ public function createFromArray($arr){ $objFoo = new Foo(); $objFoo->p1 = $arr['p1']; // itd return $objFoo; } public function createFromUser($user){ ... } public function createFromPOSTRequest($arrPost){ ... } // itd. } Unikamy stosowania 'if'. -------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 175 Pomógł: 12 Dołączył: 28.06.2007 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
WaterIntelligence, nie rozumiem, jak chcesz unikac ifów (ew. case'ów) stosując Factory ? Wg mnie jedno z drugim jest powiazane. Co za tym idzie, aby osiągnać coś na kształt overrida i tak musimy wykonać rzezbe na parametrach konstruktora.
Ten post edytował plurr 4.02.2009, 17:43:49 -------------------- Wyobraźnia bez wiedzy może stworzyć rzeczy piękne.
Wiedza bez wyobraźni najwyżej doskonałe. Albert Einstein |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 7 Pomógł: 1 Dołączył: 29.09.2008 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
To oczywiście zależy w jakim miejscu budujemy taki obiekt. Możemy przecież zbudować go bezpośrednio wywołując metodę konkretną z fabryki w klasie klienta. Wtedy nie ma w ogóle potrzeby korzystania z 'if'. Podam przykład który zobrazuje o co mi chodziło:
CODE // Dla fabryki: class JakisKontroler{ $arr['wypelniacz1'] = $_POST['wypelniacz1']; $arr['wypelniacz2'] = $_POST['wypelniacz2']; $obj = $objFabrykaKlasyA->zbudujZtablicy($arr); } // sposób na "if'y" class JakisKontroler{ public function wykonajCos(){ $arr['wypelniacz1'] = $_POST['wypelniacz1']; $arr['wypelniacz2'] = $_POST['wypelniacz2']; $obj = new KlasaA($arr); // w konstruktorze wykonuja sie warunki } } Jak widać w pierwszym przypadku w ogóle nie ma 'if' a jedynie wywołanie konkretnej metody, ściśle określonej. Dodatkowo odciążamy klasę od odpowiedzialności budowania obiektu z samej siebie. Klasa moim zdaniem powinna przejmować się tym co ma robić, a nie tym w jaki sposób ma sie "rodzić" - od tego powinny być inne obiekty (oczywiście nie w każdym przypadku ale akurat w tym tak). Co więcej uznaje za złe stosowanie przeciążania ponieważ jest ono niejednoznaczne i łatwo można zapomnieć jakie parametry stosować aby otrzymać to co chcemy, przy stosowaniu metod taki problem nie istnieje bo jest wszystko jasne i przejrzyste. Jest jeszcze kwestia tego, że przecież nie tylko możemy ustawiać zmienne w tworzonym obiekcie ale wykonywać bardziej złożone operacje podczas budowania obiektu. Więc lepiej trzymać się jednej metodyki wtedy projekt staje się spójny. -------------------- |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 8.08.2007 Skąd: Leszno Ostrzeżenie: (0%) ![]() ![]() |
wcale w Factory nie musisz stosować ifów
możesz przecież skorzystać z ReflectionClass ewentualnie stworzyć obiekt na podstawie zmiennej $object = new $classname(); |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.05.2025 - 07:50 |