Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Globalne zmienne wewnątrz klas
Asmox
post
Post #1





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


Wiem, że stosowanie zmiennych globalnych w klasach nie jest zbyt dobrym pomysłem, ale kurczę po coś wymyślono te global i trzeba wykorzystać (IMG:http://forum.php.pl/style_emoticons/default/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?

Ten post edytował Asmox 6.05.2009, 16:53:36
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
Lejto
post
Post #2





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


zajrzyj lepiej do manuala
http://pl.php.net/manual/pl/language.variables.scope.php
Go to the top of the page
+Quote Post
piotrooo89
post
Post #3


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




private global

to private czy global? a w OOP używa się public aby obiekt był widoczny poza klasą.
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


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.
Go to the top of the page
+Quote Post
rzymek01
post
Post #5





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

oczywiście jak chcesz je gdzieś dalej wykorzystac to możesz spłodzić funkcję w klasie, która te dane bedzie udostepniać
Go to the top of the page
+Quote Post
Asmox
post
Post #6





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


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...?
Go to the top of the page
+Quote Post
zelu
post
Post #7





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


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
Go to the top of the page
+Quote Post
Asmox
post
Post #8





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


Właśnie nie o to chodzi. Chcę, żeby klasa mogła korzystać z pliku konfiguracyjnego.
Go to the top of the page
+Quote Post
phpion
post
Post #9





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
rzymek01
post
Post #10





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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
Go to the top of the page
+Quote Post
Asmox
post
Post #11





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


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. ?>
Go to the top of the page
+Quote Post
rzymek01
post
Post #12





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


do twojego problemu najbardziej jednak pasuje rada kolegi phpion (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
jajcarzd1
post
Post #13





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

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


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.

Ten post edytował jajcarzd1 8.05.2009, 07:52:41
Go to the top of the page
+Quote Post
Asmox
post
Post #14





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


Cytat(rzymek01)
do twojego problemu najbardziej jednak pasuje rada kolegi phpion (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
phpion
post
Post #15





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Asmox
post
Post #16





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


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?
Go to the top of the page
+Quote Post
marcio
post
Post #17





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


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.
Go to the top of the page
+Quote Post
Asmox
post
Post #18





Grupa: Zarejestrowani
Postów: 359
Pomógł: 12
Dołączył: 16.01.2009

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


czyli dobrze zrobiłem, czy nie? Bo trochę nie rozumiem Twojej wypowiedzi.
Go to the top of the page
+Quote Post
rzymek01
post
Post #19





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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ł (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.09.2025 - 10:40