Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wywoływanie abstrakcyjnej metody dziecka w operacji rodzica, abstract, extends, self i fatal error
starach
post
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


  1. <?php
  2. abstract class Rodzic
  3. {
  4.    /**
  5.      * Operacja wykorzystywana przez potomstwo
  6.      */
  7.    public static function operacja()
  8.    {
  9.        echo self::innaOperacja();
  10.    }
  11.    /**
  12.      * Wymagana operacja do zaimplementowania przez dziecko
  13.      */
  14.    abstract public static function innaOperacja();
  15. }
  16. class Dziecko extends Rodzic
  17. {
  18.    public static function innaOperacja()
  19.    {
  20.        return 'Dane indywidualne dla każdego dziecka.';
  21.    }
  22. }
  23. // Wywoła błąd:
  24. // Fatal error: Cannot call abstract method Rodzic::innaOperacja()
  25. Dziecko::operacja();
  26. ?>
Jak ten problem rozwiązać? (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Go to the top of the page
+Quote Post
nevt
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


to nie ma prawa zadziałać
a dlaczego nie po prostu:
  1. <?php
  2. abstract class Rodzic
  3. {
  4.    abstract public static function operacja();
  5. }
  6.  
  7. class Dziecko extends Rodzic
  8. {
  9.    public static function operacja()
  10.    {
  11.        return 'Dane indywidualne dla każdego dziecka.';
  12.    }
  13. }
  14.  
  15. echo Dziecko::operacja();
  16. ?>
(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
starach
post
Post #3





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Metoda operacja jest podzielona na 5 innych z czego niektóre wywołują się rekurencyjnie i generalnie cała struktura jest cholernie skomplikowana. Natomiast klas dzieci będzie blisko 15, więc chyba zgodzisz się że kompletnym bezsensem i wręcz błędem było by przenoszenie tej implementacji. Oprócz tego istnieje konieczność udostępnienia wartości zwracanej przez metodę innaOperacja(). Inne drogi nie ma. Trzeba w tym kierunku poprzez dziedziczenie i abstrakcję to zrobić.

edit>
To znaczy zapewne inna droga jest, inaczej nie byłoby sensu tutaj pytać, ale dziedziczenia raczej użyć trzeba.

Ten post edytował orglee 30.01.2009, 14:27:28
Go to the top of the page
+Quote Post
nevt
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


czy te metody muszą być statyczne (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) - bo jeżeli tak, to problem jest nie do rozwiązania (przynajmniej ja go nie widzę)...
a jeżeli nie, to wewnątrz operacja() dajesz odwołanie $this->innaOperacja() i wtedy woła ci funkcję odpowiednią dla dla instancji obiektu...
Go to the top of the page
+Quote Post
plurr
post
Post #5





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

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


w pewnej bibliotece użłem tego samego rozwiązania - i działa.
Jednakże nie korzystam z metod statycznych - może w tym tkwi problem ?

Ten post edytował plurr 31.01.2009, 16:54:27
Go to the top of the page
+Quote Post
guerito
post
Post #6





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 13.03.2007
Skąd: przeważnie poziome

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


Ten bład jest spowodowany użyciem eslf::. Jeżeli metoda nie musi być statyczna to jak wcześniej wspomniano powinieneś użyć $this zamiast self::. Jeżeli musi być statyczna to skorzystaj z reflectionClass. Tworzysz obiekt reflectionClass od $this pobierasz z niego swoją metodkę i ją wywołujesz. W manualu jest przykład. Powinno zadziałać w twoim przypadku.
Go to the top of the page
+Quote Post
iro88
post
Post #7





Grupa: Zarejestrowani
Postów: 47
Pomógł: 3
Dołączył: 13.10.2010
Skąd: Świdnica

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


Odgrzeję, bo nie bardzo rozumiem jak wykonać metodę dziecka z poziomu rodzica.
Mam plik index.php który sprawdza url i jeśli jest jakaś 'akcja' to ją wykonuje, a następnie wyświetla 'widok'. Wszystko gra, tylko w każdym z kontrolerów muszę powielać funkcję:
  1. public function doAction() {
  2. if (!empty($_GET['a'])) {
  3. $a = $this->filterString($_GET['a']);
  4. } else { $a = null;}
  5.  
  6. if ($a != null) {
  7. if (method_exists($this,$a)) {
  8. $this->$a();
  9. }
  10. }
  11. }

i na początku, każdego z widoków wykonywać tą funkcję. Chcąc ograniczyć ilość kodu, postanowiłem stworzyć główny kontroler aplikacji i dziedziczyć jego funkcje w pozostałych kontrolerach. Jednak nie mam pojęcia czy w ogóle jest możliwe dynamiczne wykonywanie metod dzieci z poziomu rodzica, a jeśli tak, to nie do końca wiem jak. Za wszelkie wskazówki, fragmenty kodu, dziękuję.

Edit:
Ok. Zanim zadam pytanie popróbuję najpierw 'na idiotę'. A więc: nie rozumiem, lecz spróbowałem wywołać metodę powyższym skryptem i... działa (IMG:style_emoticons/default/blink.gif)

Ten post edytował iro88 15.04.2011, 14:17:24
Go to the top of the page
+Quote Post

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: 4.10.2025 - 05:07