Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] obiekty nie widzą zmiennych z inkludowanych plików
Forum PHP.pl > Forum > Przedszkole
abort
Zaczynam dopiero poznawanie obiektówki w PHP, więc przepraszam za być może durne pytania smile.gif
Chciałem zrobić sobie klasę do zarządzania sesjami jako pierwsza część do być może czegoś większego, i do wykorzystania przez więcej niż jednego użytkownika. Żeby kod był w miarę modularny, zdecydowałem się na odseparowanie definicji klasy od właściwego kodu, ponadto wartości domyślne dla całego "czegoś" wrzuciłem do pliku inkludowanego. Fragment config.php:

  1. $config['sql']['host'] = "localhost";
  2. $config['sql']['user'] = "user";
  3. $config['sql']['pass'] = "password";
  4. $config['sql']['dbname'] = "database";
  5. $config['sql']['conn'] = "persistent";
  6. $config['sqltables']['login']['users'] = "users";
  7. $config['sqltables']['login']['logusers'] = "logusers";


plik z definicją klasy (class.httpsession.php):
  1. <?php
  2. require "config.php";
  3.  
  4. class HTTPSession {
  5. protected $session_time = 0;
  6. protected $session_data = array ();
  7. private $sql_config;
  8. public $sql_tables;
  9. public $login_page = "";
  10. public $menu_page = "";
  11. protected $handle; // handle to SQL database
  12.  
  13. function HTTPSession ($sql_config='', $sql_tables='',
  14. $login_page = "login.php",
  15. $menu_page = "index.php",
  16. $session_lifetime = 600) {
  17.  
  18. $this->session_time = $session_lifetime;
  19. $this->menu_page = $menu_page;
  20. $this->login_page = $login_page;
  21.  
  22. // w tych dwóch liniach jest blad "Undefined variable: config"
  23. $this->sql_tables = $config['sqltables']['login'];
  24. $this->sql_config = $config['sql'];
  25.  
  26. }
  27.  
  28. } // class HTTPSession
  29. ?>


W index.php mam:
  1. require "config.php";
  2. require "class.httpsession.php";
  3.  
  4. // Takie wywołanie działa ZAWSZE
  5. $sess = new HTTPSession ($config['sql'], $config['sqltables']['login'], 'l.php', 'm.php', 7200);
  6.  
  7. // A ja jestem leniem, i chciałbym wywoływać tak, żeby brał defaulty z $config...
  8. $sess = new HTTPSession ();


Jak widać, w index.php po "require config.php" mogę korzystać z wartości zdefiniowanych w tym pliku. Jeśli taki sam require wystąpi w pliku z definicją klasy, to wewnątrz klasy nie umiem skorzystać z tych wartości (patrz komentarze w kodzie).

Skorzystałem z kawałka kodu: http://wortal.php.pl/Wortal/Artykuly/PHP/A...I/Implementacje
W komentarzach jeden user napisał "Całkiem porządna instrukcja, szkoda, że autor wsadził tam bugi ... takie chyba dla inteligentnych, by sobie poprawili". Czyżby to był właśnie jeden z tych bugów?

Co zrobić (jeśli w ogóle się da?), żeby w definicji obiektu można było skorzystać z wartości konfiguracyjnych zawartych w config.php? Tak, wiem, że można użyć XMLa i są gotowe klasy do parsowania XML - ale to jest moja pierwsza klasa, więc chcę ją napisać od początku do końca, "zatrybić' obiekty, a potem się wezmę za coś więcej...


piotrooo89
require_once
by_ikar
Masakra, kłania się wiedza z zakresu "zasięg zmiennych". Jak chciałbyś mieć możliwość odczytania zmiennej która jest zdefiniowana poza funkcją/obiektem? W przypadku zarówno funkcji jak i obiektu zmienne te musisz przekazać jako parametr, lub nadać im jakiś globalny zasięg..

Cytat
W komentarzach jeden user napisał "Całkiem porządna instrukcja, szkoda, że autor wsadził tam bugi ... takie chyba dla inteligentnych, by sobie poprawili". Czyżby to był właśnie jeden z tych bugów?


Nie.

Cytat
Co zrobić (jeśli w ogóle się da?), żeby w definicji obiektu można było skorzystać z wartości konfiguracyjnych zawartych w config.php? Tak, wiem, że można użyć XMLa i są gotowe klasy do parsowania XML - ale to jest moja pierwsza klasa, więc chcę ją napisać od początku do końca, "zatrybić' obiekty, a potem się wezmę za coś więcej...


Przekazać te zmienne do tego obiektu, lub bawić się w globala, co niestety jest błędnym podejściem. W sumie sposobów znalazło by się znacznie więcej. Nie mniej dzisiaj każdy kto chce w miarę poprawnie pisać w php to przekazuje te zmienne do obiektu/funkcji.

Możesz też napisać prostą klasę konfiguracyjną która będzie miała metody statyczne, w efekcie czego będzie miała zasięg globalny.
abort
Cytat(by_ikar @ 11.11.2011, 12:48:10 ) *
Masakra, kłania się wiedza z zakresu "zasięg zmiennych". Jak chciałbyś mieć możliwość odczytania zmiennej która jest zdefiniowana poza funkcją/obiektem? W przypadku zarówno funkcji jak i obiektu zmienne te musisz przekazać jako parametr, lub nadać im jakiś globalny zasięg..


Nie taka znowu "masakra". W każdym z języków, w których dotychczas cokolwiek pisałem (C, Pascal), jest to rozwiązane deczko inaczej.
Zmienne zadeklarowane poza funkcją/klasą są dostępne, o ile nie są przesłonione zmienna o tej samej nazwie zdefiniowanej lokalnie.
Ale to kwestia podejścia projektantów języka. Widać PHP ma inaczej i trzeba nauczyć się z tym żyć.
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.