![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 30.05.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Więc tak. Chciałem zrobić sobie klasę Module, po której dziedziczą wszelkie moduły. Klasa module miałaby mieć metodę getReference() zwracającą metodę do siebie samego. No i ten dziedziczący moduł miałby dziedziczyć tą metodę. I teraz sprawa wygląda tak:
[php:1:4616761559]<?php class Module { private static $myReference; public function &getReference() { if(!isset(self::$myReference)) self::$myReference = new self; return self::$myReference; } } class User extends Module { // Zmienne odpowiadające za różne dane z formularza logowania public $login; public function __construct() { $this->login = "Foo"; } } $normal = new User; $singleton = User::getReference(); ?> <pre> <?php var_dump($normal); var_dump($singleton); ?> </pre>[/php:1:4616761559] Wynik? Cytat object(User)#1 (4) {
["login"]=> string(3) "Foo" } object(Module)#2 (0) { } No i nie wiem za bardzo jak zrobić, żeby $singleton było obiektem user. Czy da się wogóle tak zaprojektować klasę Module? -------------------- Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
a wziąłeś od uwage jak sie powyższy kod zachowa jak będą conajmniej 2 obiekty??. $myReference powinno być tablicą.
[php:1:41a4877a81]<?php class Module { private static $myReference = array(); public function &getReference($class) { if(!isset(self::$myReference[$class])) self::$myReference[$class] = new $class; return self::$myReference[$class]; } } class User { // Zmienne odpowiadające za różne dane z formularza logowania public $login; public function __construct() { $this->login = "Foo"; } } $normal = Module::getReference('user'); $normal->test='ok'; $singleton = Module::getReference('user'); ?> <pre> <?php var_dump($normal); var_dump($singleton); ?> </pre> ?>[/php:1:41a4877a81] Kod object(User)#1 (2) {
["login"]=> string(3) "Foo" ["test"]=> string(2) "ok" } object(User)#1 (2) { ["login"]=> string(3) "Foo" ["test"]=> string(2) "ok" } Jeszcze nie bawiłem sie na poważnie php5 ale powinno działac |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 30.05.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Faktycznie, lepsze rozwiązanie, dzieki. Ale nie rozumiem o co ci chodziło z tym, że źle by się zachowywało przy wielu obiektach. Ja chciałem, żeby moduły dziedziczyły z Module i dzięki temu każdy z nich dziedziczyłby metodę getReference, więc każdy zwracałby referencję do siebie samego nie zależnie ile byłoby tych obiektów.
Używałbym np. [php:1:31ad2614a9]<?php $test1 = User::getReference(); // A nie $test2 = Module::getReference('user'); ?>[/php:1:31ad2614a9] Ale dzięki, przyjrzę się i przemyślę to jeszcze raz. -------------------- Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 270 Pomógł: 0 Dołączył: 15.06.2003 Ostrzeżenie: (0%) ![]() ![]() |
no fakt to z wieloma obiektami w twoim przypadku było niepotrzebne, ale kod chyba jest ok
![]() |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Po prostu z singletona nie da się dziedziczyć... Jeżeli na raz może istnieć tylko jedna instancja Module (wliczając podklasy), to jeszcze da się zrobić. Jeżeli każda podklasa oddzielnie, to nie.
Możesz zrobić tak jak pokazał Bora, albo w każdej podklasie umieścić oddzielną kopię getReference(). Tak czy siak Module nie będzie singletonem. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 30.05.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Hmmm....
W takim razie chyba posłużę się metodą Bora. Najpierw zastanawiałem się nad stworzeniem metody abstrakcyjnej Module z metodą getReference, którą każdy moduł by przesłaniał, ale potem doszedłem do wniosku, że to tylko niepotrzebne przepisywanie kodu w każdej klasie. Dzięki! -------------------- Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Tak na marginesie: może bardziej pasowałby tutaj wzorzec Registry? Na pewno coś wspominali na phppatterns...
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 43 Pomógł: 0 Dołączył: 30.05.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Po dwóch dniach (hyhy, no nie bez przerwy
![]() ![]() Dla zainteresowanych: http://www.phppatterns.com/index.php/artic...icleview/75/1/1 Wyniki mojej analizy: Wow! To taki lepszy singleton ![]() -------------------- Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 20.07.2025 - 14:13 |