Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziedziczenie + __toString
symonides
post 7.08.2011, 21:11:35
Post #1





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 12.11.2010

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


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();


Ten post edytował symonides 7.08.2011, 21:18:36
Go to the top of the page
+Quote Post
Crozin
post 7.08.2011, 21:17:49
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
ethod Editor_Elrte::__toString() must return a string value
Co jest niezrozumiałego w tym komunikacie?
Go to the top of the page
+Quote Post
symonides
post 7.08.2011, 21:20:38
Post #3





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 12.11.2010

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


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)?

Ten post edytował symonides 7.08.2011, 21:20:56
Go to the top of the page
+Quote Post
skowron-line
post 7.08.2011, 21:32:44
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


A zobacz czy klasa View nie ma metody toString, która w twoim przypadku zwraca zmienną. Robiąc $this->render() zwracasz obiekt.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
melkorm
post 7.08.2011, 22:03:17
Post #5





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Musisz rzucić to na stringa lub wykonać na obiekcie View metodę __toString.


--------------------
Go to the top of the page
+Quote Post
symonides
post 7.08.2011, 22:43:11
Post #6





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 12.11.2010

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


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.
Go to the top of the page
+Quote Post
melkorm
post 7.08.2011, 23:10:35
Post #7





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Tak ciężko zrobić
  1. return (string)$this->_view;

?


--------------------
Go to the top of the page
+Quote Post
symonides
post 8.08.2011, 00:51:20
Post #8





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 12.11.2010

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


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);
Go to the top of the page
+Quote Post
melkorm
post 8.08.2011, 02:00:51
Post #9





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


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.


--------------------
Go to the top of the page
+Quote Post
hind
post 8.08.2011, 10:27:25
Post #10





Grupa: Zarejestrowani
Postów: 142
Pomógł: 24
Dołączył: 30.03.2009
Skąd: Rokitno Szlacheckie

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


sprawdź czy nie zwraca exception
Go to the top of the page
+Quote Post
symonides
post 9.08.2011, 21:23:33
Post #11





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 12.11.2010

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


Melkorm dobrze mówił, chociaż miałem wrażenie, że już próbowałem ten sposób. Dzięki i pozdrawiam.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 20:01