Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __toString(); Kilka pytań.
Forum PHP.pl > Forum > PHP > Object-oriented programming
zeten
Witam,

Średnio potrafię znaleźć interesujące mnie informacje na temat metody __toString()

Metodę __toString() wykorzystujemy w nowszym czy starszym PHP?

Zdarzyło mi się tak, że przekazywanie obiektu do sesji bez problemu działa na jednym hostingu.. a na drugim już nie. Na jednym i drugim znajduję się PHP 5.2.10.. Od czego to zależy?

Jeżeli zależy to od jakieś konfiguracji czy jakiegoś modułu.. to która instalacja PHP jest poprawna? Ta, która nakazuje wykorzystanie metody __toString() czy tak, która w sposób automatyczny przekształca obiekt w string? Chodzi mi tutaj głównie o nawyki poprawnego programowania w PHP.
dr_bonzo
http://www.php.net/manual/pl/language.oop5....magic.tostring

Cytat
Zdarzyło mi się tak, że przekazywanie obiektu do sesji bez problemu działa na jednym hostingu.. a na drugim już nie. Na jednym i drugim znajduję się PHP 5.2.10.. Od czego to zależy?

SOA1

Moze bys pokazal kod i ew. komunikaty bledu, ciastka sesyjne itp.

thek
toString jest "metodą magiczną". Która pozwala, jak wiesz, przesłać obiekt jako typu String. Zazwyczaj jej ciało trzeba zdefiniować gdyż dla różnych klas może ona przyjmować różne formy. Czasem może to być zapis obiektu w formie identycznej z var_dump, ale niekonieczne.
Metoda ta jest wykorzystywana w obiektowym php gdy zachodzi konieczność konwersji obiektu. Jako że nie jest jednolita jak inne funkcje to i ciężko znaleźć jej jasną wykładnię, gdyż jest po prostu definiowalna dowolnie, podobnie jak konstruktor czy destruktor klasy. To w dużej mierze od programisty zależy jak wygląda. Frameworki często mają domyślną definicję tej klasy, przez co jest w nich ona wywoływana niejawnie i gdy wyskoczy błąd z nią, to początkujący nie wiedzą skąd się ta funkcja wzięła. Ja położyłbym ją pomiędzy funkcjami konwersji, jak choćby toObject, bo tam właśnie ona przynależy. Ze swojej strony uważam, że dobrym zwyczajem byłoby, by programista o nią dbał i definiował w klasie. No chyba, że framework już za niego o to dba i ma swoją własną, domyślną wersję, bo po co pisać coś dwa razy? Tylko w przypadku różnic powinno się przeciążyć tę metodę.
cojack
@edit
post powyżej jest jak monolog prezydenta, o wszystkim i o niczym, masło maślane, coś z czegoś coś do czegoś, ale po co i jak to ni huhu. Bezsensu człowieku opisujesz problem.

dajmy na to:

  1. class A {
  2. public function __toString() {
  3. return 'jestem mega fajny';
  4. }
  5. }
  6.  
  7. $a = new A;
  8. echo $a;


szybkie objaśnienie czym jest __toString();
thek
Czuję się wezwany do tablicy przez cojacka i streszczę mój post poprzedni jeśli zagmatwałem. __toString to po prostu funkcja specjalna reagująca na wywołanie obiektu w kontekście stringa (czyli -> echo $a)
Rzucę szerszym przykładem, by pokazać dokładniej działanie skoro napisałem masło maślane winksmiley.jpg
  1. <?php
  2. class A {
  3. //kilka zmiennych klasy o różnej widoczności
  4. public $x;
  5. private $y;
  6.  
  7. //konstruktor domyślny
  8. public function __construct() {
  9. $this->x = 23;
  10. $this->y = 'cos';
  11. }
  12.  
  13. //wyświetla zmienną prywatną
  14. public function pokaz_y() {
  15. return $y;
  16. }
  17.  
  18. //zmienia zmienną prywatną
  19. public function zmien_y( $nowa ) {
  20. $this->y = $nowa;
  21. }
  22.  
  23. //funkcja "magiczna"
  24. public function __toString() {
  25. return 'jestem x ='.$this->x.' i y = '.$this->y;
  26. }
  27. }
  28.  
  29. //tworzy obiekt klasy A
  30. $a = new A;
  31.  
  32. // wyświetlenie obiektu klasy A jako string <- niejawne wywołanie __toString
  33. //wyświetlenie pokazać powinno, że nastąpiło utworzenie przez konstruktor domyślny i inicjalizacja
  34. echo $a;
  35.  
  36. //zmieniamy zmienną prywatną w obiekcie
  37. $a->zmien_y( 'string_jakis' );
  38.  
  39. //wyświetlamy obiekt znów niejawnie przez __toString powinno pokazać, że faktycznie y się zmienił
  40. echo $a;
  41.  
  42. //zmieniamy zmienną publiczną obiektu
  43. $a->x = 67;
  44.  
  45. //ponowne wyświetlenie powinno pokazać, że zmieniła się zmienna publiczna
  46. echo $a;
  47. ?>
Zastosowania tego nie widać może od razu, ale przydaje się przy pisaniu własnego CMS w MVC, gdzie widok śmiało może być obiektem i przez to wysłany być do przeglądarki jako część większego widoku. Jeśli więc masz cały layout jako choćby lewe - centrum - prawe to możesz zrobić tak:
  1. $ankieta->wpisz_dane_do_widoku_ankiety($dane_ank);
  2. $nawigacja->wpisz_dane_menu_nawigacyjnego($dane_naw);
  3. $lewe = $ankieta.$nawigacja;

Co to da? Wstawi ankietę i nawigację jako jeden string wysłany do widoku lewe smile.gif To banalny sposób na dołączanie różnych paneli dynamicznie w CMS, bo możesz każdy element dynamicznie "wrzucać" do różnych miejsc na stronie. Obłóż to JS (drag & drop) lub zaplanuj panel edycji elementów i każdy user może sobie sam layout strony ustawić oraz włączać i wyłączać potrzebne panele.
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.