Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie + __toString
Forum PHP.pl > Forum > PHP > Object-oriented programming
symonides
Cześć, w klasie bazowej mam metodę display() i __toString obie mają robić to samo, czyli wyświetlić kod, w tym przypadku akurat HTML. W klasie która dziedziczy po bazowej jest właściwość _view, która jest użyta w powyższych metodach. Gdy chcę wyświetlić kod przy pomocy metody display() wszystko działa, niestety przy wywołaniu metody __toString dostaję następujący komunikat:
Kod
Method Editor_Elrte::__toString() must return a string value


Uproszczony kod klas wygląda następująco:

  1. abstract class Editor_Editor_Core
  2. {
  3. protected $_view;
  4.  
  5. abstract public function render();
  6.  
  7. public function display()
  8. {
  9. echo $this->_view;
  10. }
  11.  
  12. public function __toString()
  13. {
  14. return $this->_view;
  15. }
  16. }
  17.  
  18. class Editor_Elrte extends Editor_Editor_Core
  19. {
  20. public function render()
  21. {
  22. $this->_view = View::factory('elrte');
  23.  
  24. return $this;
  25. }
  26. }


Chciałbym, aby można było wyświetlić kod na dwa sposoby:
  1. $editor->render()->display();
  2. // albo
  3. echo $editor->render();


Pozdrawiam

EDIT: jeszcze taka ciekawostka. Poniższy kod działa prawidłowo.
Kod
echo $editor->render()->__toString();
Crozin
Cytat
ethod Editor_Elrte::__toString() must return a string value
Co jest niezrozumiałego w tym komunikacie?
symonides
Komunikat jest jak najbardziej zrozumiały, ale przecież, z tego co rozumiem kod który sam pisałem, to skoro display() wyświetla mi stringa ($this->_view) to czemu metoda __toString nie zwraca stringa ($this->_view)?
skowron-line
A zobacz czy klasa View nie ma metody toString, która w twoim przypadku zwraca zmienną. Robiąc $this->render() zwracasz obiekt.
melkorm
Musisz rzucić to na stringa lub wykonać na obiekcie View metodę __toString.
symonides
Więc tak klasa View posiada metodę __toString(), czyli echo $editor->render() zadziała wtedy kiedy ja zwrócę $this->_view, a ja chcę zwrócić w metodzie $this żeby można było łańcuchowo wywoływać metody. Podsumowując chciałbym aby działał ten sposób z echo, jak i ten sposób z wywołaniem metody display(). wychodzi na to że do metody render() będę musiał przekazać parametr typu bool i sprawdzić instrukcją warunkową co ma metoda render() zwrócić($this->_view czy $this). Inaczej tego rozwiązać nie umiem.
melkorm
Tak ciężko zrobić
  1. return (string)$this->_view;

?
symonides
Nie o to chodzi, klasa View posiada metodę __toString() i rzutowanie nie jest potrzebne, bo jak zrobię echo to wywoła __toString(). Czyli jedyna opcja jaka przychodzi mi na myśl to
  1. public function render($display = FALSE)
  2. {
  3. $this->_view = View::factory('elrte');
  4.  
  5. if($display)
  6. {
  7. return $this->_view;
  8. }
  9. else
  10. {
  11. return $this;
  12. }
  13. }


Może troszkę niefortunnie dobrany przykład, ale obrazuje o co chodzi.

  1. $editor->render()->display();
  2. // lub
  3. echo $editor->render(TRUE);
melkorm
Metoda __toString musi zwracać STRING ona nie rzutuje sama w sobie na STRING'a jak to robi echo czy inne tego metody typu czyli musisz wywołać samemu metodę __toString na zwracanym obiekcie lub rzutować na string samemu.
hind
sprawdź czy nie zwraca exception
symonides
Melkorm dobrze mówił, chociaż miałem wrażenie, że już próbowałem ten sposób. Dzięki i pozdrawiam.
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.