Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> słowa kluczowe parent, self.. brakuje mi jednego :)
Nalfein][WR
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 22.04.2003
Skąd: Żory / K-ce

Ostrzeżenie: (0%)
-----


[php:1:9afb1fe096]
class AbstractSingleton
{
static function instance()
{
static $instance;
if (!$instance)
{
// nie mogę napisać $this, bo metoda jest statyczna
$class = self::getClassName();
$instance = new $class;
}
return $instance;
}



}


class test extends AbstractSingleton
{
function getClassName() {
return 'test'; // edit: skądś tutaj wziąłem 'test2'
}
}

test::instance();
[/php:1:9afb1fe096]

wywala błąd:

Fatal error: Call to undefined method abstractsingleton::getclassname() in E:usrwwwssiindex.php on line 12

Testowałem na PHP5 b2 i b3, z i bez słowa kluczowego "static" na początku metody. Podmieniałem self na $this, this i bez skutku.

Niby dobrze, bo self:: służy do wywołania metody klasy w której jestem, używa się jej przy nadpisywaniu. Wobec tego jakiego słowa mam użyć zamiast "self", jest jakiś odpowiednik $this bez "$" do użycia w metodach statycznych?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Nalfein][WR
post
Post #2





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 22.04.2003
Skąd: Żory / K-ce

Ostrzeżenie: (0%)
-----


No własnie. Brakuje takiego słowa w stylu "final", które umożliwiałoby dostęp do "finalnej", końcowej klasy na rzecz której byłaby wywoływana ta metoda.

Bez tego jest głupio. Bo załóżmy, że mamy klasę Aplikacja, której chcemy mieć tylko jeden obiekt, więc dodajemy do niej takie coś jak ta metoda ::instance(), w której tworzymy za pomocą "new Aplikacja" ten nowy obiekt tak jak w kodzie powyżej. Teraz wprowadzamy pewną zmianę/rozszerzenie/mod do klasy Aplikacja, ale jak szkoła OO uczy, nie modyfikujemy istniejącego kodu, lecz tworzymy nową klasę RozszerzonaAplikacja dziedziczącą z Aplikacji. Implementujemy nowe zachowanie i myślimy, że będzie wszystko działać OK. Otóż nie - otóż w Aplikacja::instance() napisaliśmy "new Aplikacja", więc gdy wywołamy RozszerzonaAplikacja::instance(), metoda ::instance() zwróci nam obiekt Aplikacja. Nie możemy napisać "new get_class($this)" w metodzie statycznej, bo nie mamy dostępu do "$this". Wspaniale. Trzeba w każdej klasie dziedziczącej nadpisywać metodę instance() powielając te linijki i zmieniając tylko to co mamy po "new", bo pomysł z ::getClassName() też nie działa.

Udało się komuś z Was zrobić klasę bazową dla singletonów coś jak ten mój "AbstractSingleton"?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 22:56