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? |
|
|
|
![]() |
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"? |
|
|
|
Nalfein][WR słowa kluczowe parent, self.. brakuje mi jednego :) 2.01.2004, 19:33:39
bamboos Witam!!
Zupełnie się nie znam na programowaniu obi... 3.01.2004, 02:15:43
DeyV Przy takim zapisie wydaje mi się, ze możliwe jest ... 3.01.2004, 02:35:05
Nalfein][WR Póki co wymyśliłem protezę, podaję w razie czego:
... 3.01.2004, 15:18:56
Nalfein][WR Proteza też okazała się spieprzona, bo get_class(t... 3.01.2004, 19:48:34 ![]() ![]() |
|
Aktualny czas: 25.12.2025 - 22:56 |