Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> __toString(); Kilka pytań.
zeten
post
Post #1





Grupa: Zarejestrowani
Postów: 36
Pomógł: 2
Dołączył: 1.08.2009
Skąd: Katowice, Rybnik

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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.



--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ę.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
cojack
post
Post #4





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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

Ten post edytował cojack 13.10.2009, 10:00:21


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 13.10.2009, 14:11:43


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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 Aktualny czas: 21.08.2025 - 23:56