Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: instancje
Forum PHP.pl > Forum > PHP > Object-oriented programming
M4chu
Witam, pisze sobie klase do obslugi wielu baz danych np DbMySql, DbPgSql itp, wybor bazy bedzie okreslany w konstruktorze np
  1. <?php
  2.  
  3. $db = new Db('MySql');
  4.  
  5. ?>

problem w tym, ze nie wiem jak w klasie Db kozystac ze zmiennych i metod klasy
  1. <?php
  2.  
  3. class Db
  4. {
  5. function __construct($type)
  6. {
  7. $this->type = $type;
  8. require_once $type.'/class.php';
  9. // i teraz nie wiem jak zrobic, zeby klasa Db miala wszystkie metody i zmienne kla
  10. $type
  11. // cos w stylu $this = $type::getInstance();
  12. }
  13. }
  14.  
  15. ?>

Pewnie zalatwia to jedna linijka kodu smile.gif
pozdrawiam
ksiadz
do juz istniejacej klasy nie mozesz przypisac mowych metod - ta klasa moze tylko odziedziczyc funkcje z wczesniej zdefiniowanej ale mozna to podejsc inaczej
  1. <?php
  2.  
  3. class DB
  4. {
  5.  
  6. public $db_functions;
  7.  
  8. function __construct($type)
  9. {
  10. $this->type = $type;
  11. require_once($type.'/class.php');
  12.  
  13. $this->db_functions = new $type;
  14. }
  15. }
  16.  
  17. ?>

a odwolac sie mozesz do funkcji w ten sposob
  1. <?php
  2.  
  3. $DB->db_functions->Query();
  4.  
  5. ?>

Chyba ze jest jakis sposob o ktorym nie mam pojecia smile.gif
M4chu
O tym sposobie wiem, jesli nie ma innego to pewnie bede musial sie nim zadowolic tongue.gif
ksiadz
chyba zeby zastosowac pewien chwyt
  1. <?php
  2.  
  3. class DB
  4. {
  5.  
  6. public $db_functions;
  7.  
  8. function __construct($type)
  9. {
  10. $this->type = $type;
  11. require_once($type.'/class.php');
  12.  
  13. $this->db_functions = new $type;
  14. }
  15.  
  16. function __call( $function, $arg )
  17. {
  18.  $this->db_functions->$function( implode( ',', $arg ) );
  19. }
  20. }
  21.  
  22. ?>

nie wiem czy dziala bo pisze "z palca" winksmiley.jpg
M4chu
Tak wlasnie o to mi chodzilo, wielkie dzieki smile.gif
bregovic
Jest tylko jeden drobny problem... mianowicie jesli jeden z argumentow przekazanych do __call jest tablica - to implode( ',', $arg ) niestety nie przejdzie... glowilem sie nad tym przez ostatnie pol godziny, ale nie moge znalezc lepszego wyjscia niz
  1. <?php
  2. function __call($function, $arg)
  3. {
  4. list($a[0], $a[1], $a[2], $a[3], $a[4]) = $arg;
  5. $this->db_functions->$function($a[0], $a[1], $a[2], $a[3], $a[4]);
  6. }
  7. ?>

Ale to jest koszmarne... Niestety nie mozna uzyc call_user_func_array" title="Zobacz w manualu PHP" target="_manual - a przynajmniej ja nie porafie uzyc tego na obiekcie. Znalazlem za to call_user_method_array" title="Zobacz w manualu PHP" target="_manual - i to jest to!
  1. <?php
  2. function __call($function, $arg)
  3. {
  4. call_user_method_array($function, $this->db_functions, $arg);
  5. }
  6. ?>
davidD
Cytat(bregovic @ 2004-08-10 22:40:14)
[...] Znalazlem za to call_user_method_array" target="_blank - i to jest to!
  1. <?php
  2. function __call($function, $arg)
  3. {
  4. call_user_method_array($function, $this->db_functions, $arg);
  5. }
  6. ?>

To już chyba lepiej zrobić tak:

  1. <?php
  2. function __call($function, $arg)
  3. {
  4.  call_user_func_array(array(&$this->db_functions, $function), $arg);
  5. }
  6. ?>


Zalecają właśnie ten sposób przy opisie call_user_method_array

Pozdrawiam smile.gif
bregovic
Ups! To sie nazywa slepota - nie zauwazyc WARNINGa ;]
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.