Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z klasami (dziedziczenie + singletony)
lolek09
post 21.04.2004, 17:18:38
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
Go to the top of the page
+Quote Post
Bora
post 21.04.2004, 21:24:33
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
Go to the top of the page
+Quote Post
lolek09
post 22.04.2004, 06:03:48
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
Go to the top of the page
+Quote Post
Bora
post 22.04.2004, 09:26:55
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 smile.gif
Go to the top of the page
+Quote Post
hawk
post 22.04.2004, 10:26:35
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.
Go to the top of the page
+Quote Post
lolek09
post 22.04.2004, 16:24:54
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
Go to the top of the page
+Quote Post
hawk
post 22.04.2004, 16:26:28
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...
Go to the top of the page
+Quote Post
lolek09
post 23.04.2004, 16:59:28
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 biggrin.gif) analizy i rozmyślań przez które popadłem w niełaskę u połowy grona pedagogicznego mego smile.gif stwierdzam, że to jest dokładnie to czego szukałem! Dzięki hawk!
Dla zainteresowanych:
http://www.phppatterns.com/index.php/artic...icleview/75/1/1
Wyniki mojej analizy:
Wow! To taki lepszy singleton winksmiley.jpg To znaczy kiedy chcemy, to tworzy nam nowy obiekt, a kiedy nie chemy to działa jak normalny singleton.


--------------------
Chciałbyś zobaczyć program bez błędów? Wyobraź sobie UFO, w którym Elvis doi swojego jednorożca
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 20.07.2025 - 14:13