Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmiana pól obiektu
Forum PHP.pl > Forum > PHP
angerthor
Witam,

Oto mój problem : mam klasę strona.inc

  1. <?php
  2. class Strona
  3. {
  4. protected $tytul
  5.  
  6.  
  7. function __construct ($tytul ="moja www")
  8. {
  9. $this -> tytul = $tytul
  10. }
  11.  
  12. function wyswietl ()
  13. {
  14.  
  15. echo '<html><head><title>'.$this -> tytul.'</head><body>';
  16. wyswietl_body();
  17. echo '</body></html>';
  18. }
  19.  
  20. function wyswietl_body()
  21. {
  22. // tutaj jakis skrypt ktory includuje odpowiednie strony
  23. }
  24.  
  25.  
  26. }
  27. ?>


pozniej plik index.php
  1. <?php
  2. require(strona.inc);
  3. $strona = new Strona();
  4. $strona ->wyswietl();
  5. ?>


funkcja wyswietl body na podstawie urla includuje opowiedni plik, co onzacza, ze zawsze operujemy na pliku index.php

i teraz moj problem, mamy np. podstrona.php, ktora jest includowana do czesci body i chcemy w niej zmienic pole tytul
  1. <?php
  2. $this - > tytul = "nowy tytul";
  3. ?>


rzeczywiscie po wpisaniu echo $this ->tytul, tytuł rzeczywiście jest zmieniony, ale w gornym pasku przegladarki pozostaje poprzedni.

Czy mozna cos na to poradzic z poziomu strony "podstrona.php", czy jedyne wyjscie to odpowiedni kod w pliku index.php, ktory bedzie dawal konstruktorowi opcjonalny parametr tytul ?

Mam nadzieje, ze to w miare jasno wytlumaczylem winksmiley.jpg

Z gory dzieki
bim2
protected $tytul
zamień na
public $tytul
Foxx
bim2 - nie w tym rzecz. Przecież ta klasa może korzystać z własnego pola protected.
Analizowałem Twój kod, angerthor i dochodzę do wniosku, że z ogólną koncepcją jest
coś nie tak: wyświetlasz stronę nadając jej tytuł w konstruktorze, potem wyświetlasz title za
pomocą metody wyswietl() a potem tresc w body. Ale jeżeli w tej tresci body zmienisz title to
żeby go wyświetlić w pasku przeglądarki, musiałbyś ponownie wyświetlić fragment kodu z <title>.
Ale jeżeli przeładujesz stronę - cały proces powtórzy się od nowa i znowu będziesz miał domyślnie
przydzielony title w konstruktorze + zmienną ustawioną na nowy tytuł ale niewyświetloną.
angerthor
No właśnie tak samo myślę. Zastanawiałem się tylko czy to można jakoś obejść winksmiley.jpg, ale jak się nie da to trudno.
nexik
renderowanie kodu powinno byc na koncu - robienie takiego spaghetti jest zlym pomyslem, oczywiscie jak sie upierasz przy tym rozwiazaniu mozna

napisac funkcje wyswietlbody ktora podmienia title i zwraca string (kod html) przypisac go do zmiennej $body
a potem dopiero wyswietlic wszystko w templatce
angerthor
oky, to proszę napiszcie, czy moja koncepcja jest optymalna:

Opierajac sie na formie strony z pierwszego postu doszedlem do wniosku, ze aby zmieniac temat zamieszcze odpowiedni kod w pliku index.php, tam gdzie jest wywolywany konstruktor.

Mój problem: mam stronę z różnymi podstronami, m.in. z artykułami. Na wszystkich podstronach chce mieć title="moja www", na stronie z artykułami chcę mieć title="tytuł" pobrany z bazy danych. Rozbijając urla mogę się dowiedzieć, czy ten url prowadzi do artykułu, czy do jakiejś innej podstrony, i modyfikując plik index.php mam :

  1. <?php
  2. require(strona.inc);
  3.  
  4. $adres = robij_url(); // rozbija url, zwracajac tablice
  5.  
  6. $pozycja = "";
  7. if ($adres[2] == "artykul")
  8. {
  9.        // tutaj lacze sie z baza Mysql i pobieram z niej tytuł odpowiedniego artu
  10.  
  11.    $tytul = $art['tytul'];
  12.  
  13.    $strona = new Strona($tytul);
  14.  
  15. }
  16. else {
  17. $strona = new Strona();
  18. }
  19.  
  20. $strona ->wyswietl();
  21. ?>


czy taka koncepcja jest w miarę wydajna ? Pytam bo dopiero nie dawno przestawiłem się ze strukuralnego php, na obiektowy i do konca nie jestem pewien czy moj kod jest wydajny ;P
Crozin
  1. <?
  2.  
  3. $strona = new Strona();
  4.  
  5. if(/* jest artykulem */){
  6.  $strona->setTitle('Tytul');
  7. }
  8.  
  9. $strona->display();
  10. ?>
angerthor
fakt, wielki dzięki,

a jeszcze takie pytanie ogólne: czy lepiej jest tworzyć wszystkie settery (np. setTitle, setDesciption, setSth itd.), czy stworzyc jedna funkcje __set ?


  1. <?php
  2. function __set ($nazwa, $wartosc)
  3.    {
  4.        $this -> $nazwa = $wartosc;
  5.    }
  6. ?>



i pozniej juz tylko
  1. <?php
  2. $this -> tytul = "cos tam";
  3. ?>
Crozin
Jeżeli __set() ma tak wyglądać to lepiej go nie robić.
ayeo
Przenoszę na PHP.

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.