Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z klasami (dziedziczenie + singletony)
Forum PHP.pl > Forum > PHP
lolek09
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?
Bora
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
lolek09
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.
Bora
no fakt to z wieloma obiektami w twoim przypadku było niepotrzebne, ale kod chyba jest ok smile.gif
hawk
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.
lolek09
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!
hawk
Tak na marginesie: może bardziej pasowałby tutaj wzorzec Registry? Na pewno coś wspominali na phppatterns...
lolek09
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.