Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Globalne zmienne wewnątrz klas
Forum PHP.pl > Forum > Przedszkole
Asmox
Wiem, że stosowanie zmiennych globalnych w klasach nie jest zbyt dobrym pomysłem, ale kurczę po coś wymyślono te global i trzeba wykorzystać smile.gif . Niestety pojawiają się problemy, choć wcale nie chodzi o to że się w niej gubię. Mam plik konfiguracyjny:
CODE
$db['host'] = "localhost";
$db['user'] = "root";
$db['pass'] = "root";
$db['base'] = "mngclass";
$db_config = new Registry($db);
?>

W pliku testującym załączam wszystkie inne klasy itd, a w pliku z klasą GenericObject mam coś takiego:
  1. <?php
  2. class GenericObject {
  3.  
  4.  private $id;
  5.  private $table_name;
  6.  
  7.  private $database_fields;
  8.  private $loaded;
  9.  private $modified_fields;
  10.  
  11. /*linia 11*/  private global $db_config;
  12. ?>


Próba odpalenia kodu skutkuje czymś takim:
Cytat
Parse error: parse error, expecting `T_VARIABLE' in D:\servhost\Asmox toolkit\class_genericObject.php on line 11

Co się stało?
Lejto
zajrzyj lepiej do manuala
http://pl.php.net/manual/pl/language.variables.scope.php
piotrooo89
private global

to private czy global? a w OOP używa się public aby obiekt był widoczny poza klasą.
marcio
Cytat
Wiem, że stosowanie zmiennych globalnych w klasach nie jest zbyt dobrym pomysłem, ale kurczę po coś wymyślono te global i trzeba wykorzystać

Po to sie pisze w OOP zeby nie uzywac zmiennych globalnych masz po to public.

Chcesz pisac OOP czy co,po to wymyslono skladowe dostepu by je uzywac.
rzymek01
Asmox,
co za problem zrobić, że w konstruktorze podajesz tablicę z danymi bazy danych i potem np. ją usuwasz i wtedy tylko ta klasa ma do nich dostęp smile.gif

oczywiście jak chcesz je gdzieś dalej wykorzystac to możesz spłodzić funkcję w klasie, która te dane bedzie udostepniać
Asmox
Użycie global $db w każdej funkcji rozwiązuje problem, ale nie podoba mi się to... w takim razie może wytłumaczę mój problem:
Mam "plik konfiguracyjny" z danymi bazy. Chciałbym aby dało się korzystać z tych danych. Tylko nie bardzo rozumiem co mi tam napisaliście. Chciałbym najlepiej jakiegoś gotowca, ale skoro u was ich nie dają to może dokładniejsze wskazówki...?
zelu
Jeżeli dobrze rozumiem o co Ci chodzi, to możesz sobie wewnątrz klasy zadeklarować połączenie z bazą danych i poruszać się w obrębie tej klasy...

Pozdro
Asmox
Właśnie nie o to chodzi. Chcę, żeby klasa mogła korzystać z pliku konfiguracyjnego.
phpion
No to nie możesz zrobić klasy z metodami statycznymi odwołującymi się do konkretnych zasobów? W Kohana działa to bardzo fajnie.
rzymek01
yhy, to może jakoś tak:

- masz plik konfiguracyjny - tworzysz sobie klasę cConf, która odpowiada za ten plik konfiguracyjny (odczyt, zapis)
- tworzysz obiekt klasy cConf, a potem za pośrednictwem jakiejś funkcji składowej odczytujesz dane z pliku i zapisujesz do wewnętrzych zmiennych (najlepiej private, tak aby nie dało się ich edytowac z zewnątrz)
- i teraz:
1) inne klasy mogą od razu w parametrach funkcji składowych oczekiwać okreslonych danych (np. hasło do bazy)
2) inne klasy w parametrze funkcji składowej oczekują adresu obiektu klasy i dopiero potem odczytują sobie hasło do bazy

rozwiązanie nr1 wydaje się najlepsze, ponieważ inne klasy nie muszą znać w ogóle klasy od pliku konfiguracyjnego, a także bezpieczniejsze, bo nie podajemy adresu obiektu żadnej innej funkcji

Pozdrawiam
Asmox
Tak, ale zauważyłem, że po stworzeniu egzemplarza klasy cconf, mamy zmienną, która nie jest dostępna w klasie x. Więc żeby była widoczna, trzeba by było uglobalnić zmienną z tym egzemplarzem (klasy cconf).
Poszperałem trochę w moich książkach do PHP. Znalazłem fajną funkcję parse_ini_file($sciezka, $obecnosc_sekcji). Funkcja przerabia normalnie plik konfiguracyjny i tworzy elegancką tablicę asocjacyjną. Nie wiem tylko, czy dobrze napisałem kod (nie chodzi o poprawność działania, ale różne wypadki, jak np. przeniesienie konfiguracji w inne miejsce - czy będzie można łatwo poprawić zmiany, czy też nie):
wycinek klasy GenericObject:
  1. <?php
  2. public function Initialize($table_name, $conf_res, $id=NULL) {
  3.    $this->table_name = $table_name;
  4.    $get_conf = parse_ini_file($conf_res, true);
  5.    $db = $get_conf["database"];
  6.    $this->db = new sql($db["DATABASE_HOST"], $db["DATABASE_USER"], $db["DATABASE_PASS"], $db["DATABASE_NAME"]);
  7.    $this->id = $id;
  8.  }
  9. ?>

klasa User:
  1. <?php
  2. class User extends GenericObject
  3. {
  4.  public function __construct($id=NULL) {
  5.    $this->initialize("users", "config.ini", $id);
  6.  }
  7. }
  8. ?>
rzymek01
do twojego problemu najbardziej jednak pasuje rada kolegi phpion smile.gif
jajcarzd1
Najprościej (choć nie najlepiej) z tego co wywnioskowałem z Twojego postu to po stworzeniu już instancji klasy bazodanowej zrobiłbym tak:

  1. <?php
  2. class GenericObject {
  3.  
  4.  private $id;
  5.  private $table_name;
  6.  
  7.  private $database_fields;
  8.  private $loaded;
  9.  private $modified_fields;
  10.  
  11.  private $db_config;
  12.  
  13.  public function __construct() {
  14.    global $db_config;
  15.    $this->db_config = $db_config;
  16.  
  17. }
  18.  
  19. }
  20. ?>


więc po stworzeniu instancji tej klasy w konstruktorze przypiszesz sobie instancję klasy bazodanowej.
Asmox
Cytat(rzymek01)
do twojego problemu najbardziej jednak pasuje rada kolegi phpion smile.gif

Cytat(phpion)
No to nie możesz zrobić klasy z metodami statycznymi odwołującymi się do konkretnych zasobów? W Kohana działa to bardzo fajnie.

Kohany wolałbym na razie nie używać. Po niezłej wpadce z Zendem, godzinie spędzonej na przepisywaniu kodu znak po znaku (przede wszystkim trudno było mi zrozumieć o co chodzi) i nie rozwiązaniu problemu, postanowiłem przez jakiś czas robić własne rozwiązania.
phpion, czy masz na myśli coś takiego?
  1. <?php
  2. static class Registry
  3. {
  4. public static $db_config = array('host', 'user', 'pass', 'db');
  5.  
  6. public static function getDbConf() {
  7. return self::db_config
  8. }
  9. }
  10. ?>

Przepraszam za błędy w kodzie, ale jeszcze nie bardzo wiem, jak to się robi z tymi statycznymi klasami biggrin.gif
phpion
Cytat(Asmox @ 11.05.2009, 21:10:29 ) *
phpion, czy masz na myśli coś takiego?

Generalnie tak, o to mi chodzi. Po usunięciu błędów składniowych to będzie to smile.gif
Asmox
tak może być?
  1. <?php
  2. class Config
  3. {
  4. private static $db_config = array("DB_CONFIG_HOST" => 'host', "DB_CONFIG_USER" => 'user', "DB_CONFIG_PASS" => 'pass', "DB_CONFIG_NAME" => 'db');
  5.  
  6. public static function getDbConfig(){
  7. return self::$db_config;
  8. }
  9. }
  10. ?>


A jeszcze przeglądając niektóre FW zauważyłem, że używa się też stałych. Może one by się nadawały?
marcio
Stale lepiej uzywac do lokalizacji plikow/katalogow a konwencja mowi ze $db chodzi o baze i wtedy wiadomo,ja jakos wole tablice na dane do bazy.
Asmox
czyli dobrze zrobiłem, czy nie? Bo trochę nie rozumiem Twojej wypowiedzi.
rzymek01
jak najbardziej taki kod jest poprawny, więcej nie można powiedzieć nie znając struktury aplikacji, ale sądząc po wczesniejszych wypowiedziach, taki kod bedzie ci odpowiadał smile.gif
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.