Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Zasięg zmiennych ?
Forum PHP.pl > Forum > Przedszkole
Wolfie
Witam

Mam taki kawalek kodu

  1. function mailbox($params) {
  2. $_SESSION['login'] = $_POST['mailbox'];
  3. $_SESSION['pass'] = $_POST['pass'];
  4. if(($this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {
  5. $this->view = new LoginView;
  6. $this->view->setVars('wrong','Niepoprawny login lub hasło');
  7. $this->view->display('login');
  8. //echo 'Niepoprawny login lub hasło!';
  9. } else {
  10. //echo 'Zalogowany!';
  11. $this->model->inbox();
  12. $stats = $this->model->status();
  13. $num = $stats['Nmsgs'];
  14. $view = new LoginView;
  15. $boxes = $this->model->getMailboxes();
  16. $msgsParts = $this->model->getMsgsParts($num);
  17. //$view->setVars('controller', 'controller');
  18. $view->setVars('stats', $stats);
  19. $view->setVars('boxes', $boxes);
  20. $view->setVars('parts',$msgsParts);
  21. $view->display($params['action']);
  22. }
  23. }


Widac, ze mamy tutaj warunek if.
Sprawa tyczy sie zmiennej $this->view.
W pierwszej czesci petli klasa widoku jest inicjowana w ten sposob :

  1. $this->view = new LoginView;


Zas w drugiej części warunku if tak :

  1. $view = new LoginView;


A to dlatego ze jak probuje w drugiej czesci petli zainicjowac klase w ten sam sposob co w pierwszej dostaje taki blad :

Cytat
Notice: Undefined variable: view in C:\Apache\htdocs\PrackaMgr\controllers\class.LoginController.php on line 42

Fatal error: Cannot access empty property in C:\Apache\htdocs\PrackaMgr\controllers\class.LoginController.php on line 42


No i teraz pytanie, dlaczego w drugiej czesci petli nie moge zainicjowac klasy widoku w ten sam sposob co w pierwszej czesci czyli $this->view ..... ?
cojack
Pokaż dokładnie 42 linijke kodu.
Wolfie
prosze bardzo :

  1. $view = new LoginView;


InosU31
to blad wyskjakuje ci jak dajesz
$this->view = new LoginView;
czy
$view = new LoginView;

bo sie pogibilem ;-)

druga sprawa to taka ze: dlaczego nie mozesz przed instrukcja if umiescic tego?? :
$this->view = new LoginView;




thek
Z moich doświadczeń wynika, że każda zmienna, która zaistnieje wewnątrz pętli czy warunku ma zasięg tylko na ten kawałek kodu objęty klamerkami w jakich się znajduje. Jedynym wyjściem jest wyrzucenie jej poza nawiasy i dopiero wewnątrz nich nadawanie jej wartości.
Dla twojego przypadku więc mogłaby być przed IF zmienna do której wrzucono by to, co zwraca connect i względem niej potem następowały by działania. Poza tym zauważ, że LoginView jest inicjowane niezależnie od true czy false sprawdzanego warunku, a więc może śmiało być wyrzucone poza strukturę kontrolną, co zresztą w tym przypadku jest Ci na rękę i likwiduje problem zasięgu widoczności zmiennej.

EDIT: Takie podejście ma jeszcze tę zaletę, że wyrzucenie przed IF funkcji connect stworzy podstawę pod przechowywanie uchwytu (identyfikatora) połączenia ze skrzynką. A przecież w późniejszych wywołaniach jest on nagminnie wykorzystywany i siłą rzeczy jego przechowywanie w klasie jest bardzo wskazane.
Wolfie
No tak Panowie, macie racje, przerobilem to w ten sposob :

  1. function mailbox($params) {
  2. $_SESSION['login'] = $_POST['mailbox'];
  3. $_SESSION['pass'] = $_POST['pass'];
  4. $imap_connection = $this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap');
  5. if($imap_connection == false) {
  6. $this->view->setVars('wrong','Niepoprawny login lub hasło');
  7. $this->view->display('login');
  8. //echo 'Niepoprawny login lub hasło!';
  9. } else {
  10. //echo 'Zalogowany!';
  11. $this->model->inbox();
  12. $stats = $this->model->status();
  13. $num = $stats['Nmsgs'];
  14. //$view = new LoginView;
  15. $boxes = $this->model->getMailboxes();
  16. $msgsParts = $this->model->getMsgsParts($num);
  17. $this->view->setVars('stats', $stats);
  18. $this->view->setVars('boxes', $boxes);
  19. $this->view->setVars('parts',$msgsParts);
  20. $this->view->display($params['action']);
  21. }
  22. }



Wywolanie klasy LoginView przerzucilem do konstruktora klasy kontrolera którego czesc widac wyzej...

Szczegolnie zainteresowala mnie ta koncepcja przechowywania uchwytu połączenia ze skrzynka pocztowa

Cytat
A przecież w późniejszych wywołaniach jest on nagminnie wykorzystywany i siłą rzeczy jego przechowywanie w klasie jest bardzo wskazane.


Tylko zetutaj jednej rzeczy nie rozumiem, tworze sobei zmienna ktora przechowuje mi identyfikator połączenia, tylko ze pozniej przechodzę juz do innego kontrolera i tak naprawde musze znowu odnawiac połączenie ze skrzynka......w sumie teraz mi przyszlo do glowy zeby zrobic tylko jeden kontroler do obslugiwania skrzynki pocztowej , bo teraz mam to podzielone na dwa kontrolery, jeden sprawdza czy uzytkownik sie prawidlowo zalogowal, drugi zas odpowiada za manipulacje na poszczegolnych skrzynkach pocztowych......wiec chyba najlepszym rozwiazaniem bedzie przerzucic to do jednej klasy kontrolera i dzieki temu nie bede tracil połączenia ze skrzynka......


Chyba ze jest sposob aby przekazac jakos identyfikator połączenia w jakiejs zmiennej przez bootstrap zebym z kolejnym żądaniem nie musial znowu sie łączyć do skrzynki ? Czyli czy da sie przekazać identyfikator połączenia wraz z kolejnym żądaniem ? to by mi zaoszczedzilo pracy winksmiley.jpg
thek
Myślę, że bardziej sensowne jest tworzenie pojedynczej i przechowywanie identyfikatora w niej, gdyż daje to możliwość prostszego rozwinięcia pomysłu na wszechstronniejszy. Dlaczego? Ten pomysł już kiedyś na forum rzuciłem w temacie o mailboxie i znów go przytoczę. Jeśli zechcesz kiedyś zrobić webowy mailbox, gdzie tworzysz zakładki, to każda z nich może robić za osobna skrzynkę pocztową. Obiekt tej klasy więc będziesz mógł osobno obsługiwać, niezależnie od pozostałych zakładek, gdyż pamięta on swój identyfikator połączenia, niezależny od innych zakładek i tylko jego używa. Bez przechodzenia i szukania go w jakiejś zmiennej, która może zostać nadpisana przez inny mailbox.
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.