Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Zastosowanie getInstance
rasgan
post
Post #1





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 30.05.2007
Skąd: Kleszczów

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


Witam, napisałem sobie klasę SQL do obsługi bazy. Nic nadzwyczajnego. Mam też dwie inne klasy: Extenstion (ładuje mi klasy rozszerzeń) i klasę Auth (klasa z autoryzacja uzytkownika). Na czym polega problem? Nie umiem się w klasie Auth odwołać do bazy danych. Podam kod i może będzie jaśniej:

Część kalsy SQL
  1. <?php
  2. public static function init( $host, $user, $pass, $dbname, $p = false )
  3. {
  4. if ( !self::$instance instanceof self )
  5. {
  6. self::$instance = new Wolf_MySQL_DBE( $host, $user, $pass, $dbname, $p = false );
  7. }
  8. return self::$instance;
  9. }
  10. ?>


Klasa extension
  1. <?php
  2. class Extension
  3. {
  4. public $db;
  5. public $auth;
  6.  
  7. public function __construct()
  8. {
  9. $this->db = SQL::init( 'localhost', 'root', '', 'test', false );
  10. $this->auth = AUTH::init();
  11. }
  12. }
  13. ?>


i klasa AUTH (jej część)
  1. <?php
  2. class AUTH extends Extension {
  3. private static $instance;
  4.  
  5. public static function init()
  6. {
  7. if ( !self::$instance instanceof self )
  8. {
  9. self::$instance = new AUTH();
  10. }
  11. return self::$instance;
  12. }
  13. function login( $login, $pass )
  14. {
  15. echo "<p>------------------------------------------------------</p>";
  16.  
  17. echo "<p>------------------------------------------------------</p>";
  18. }
  19. }
  20. ?>


Nie wiem w jaki sposób odwołać sie w metodzie login do bazy danych. Próbowałem poprzez $this->db->setSql(), przez $db->setSql(), setSql i nic, dostaję komunikat
Kod
Call to a member function set_sql() on a non-object inobject


Co robię źle? Widziałem podobny mechanizm u kumpla, ale on siedzi w wojsku i nie ma mi jak wyjaśnić co zrobił :/

Ten post edytował rasgan 13.07.2007, 10:39:04
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Ja proponuję takie rozwiązanie:
  1. <?php
  2.  
  3. class SQL
  4. {
  5.  
  6. public function __construct()
  7. {
  8. echo '<b> SQL::__construct() </b><br />';
  9. }
  10.  
  11. public function connect( $dbhost, $dbuser, $dbpass, $dbname, $persistent=true )
  12. {
  13. echo '<b> SQL::connect() </b><br />';
  14. }
  15.  
  16. public function setSQL()
  17. {
  18. echo '<b> SQL::setSQL() </b><br />';
  19. }
  20.  
  21. }
  22.  
  23.  
  24. class Auth
  25. {
  26.  
  27. public function __construct() 
  28. { 
  29. echo '<b> Auth::__construct() </b><br />';
  30. }
  31.  
  32. public function login()
  33. {
  34. echo '<b> Auth::login() </b><br />';
  35.  
  36. // Wykonujemy zapytanie
  37. $ext = new Extension();
  38. $ext->SQL->setSQL();
  39. }
  40.  
  41. }
  42.  
  43.  
  44.  
  45. class Extension
  46. {
  47. private static $objects = array();
  48.  
  49.  
  50. public function __construct() { }
  51.  
  52. public function __get( $object )
  53. {
  54. $object = strtolower( $object );
  55.  
  56.  
  57. // Sprawdzamy, czy dana klasa istnieje 
  58. // i czy jej obiekt znajduje się już w tabeli Extension::$objects
  59. // Jeśli nie, to go tworzymy
  60. if( !isset( self::$objects[$object] ) ) 
  61. {
  62. if( !class_exists( $object, true ) ) {
  63. throw new Exception( 'Class "' . htmlspecialchars( $object, ENT_QUOTES, 'UTF-8' ) . '" not exists' );
  64. }
  65.  
  66. self::$objects[$object] = new $object();
  67. }
  68.  
  69.  
  70. // Zwracamy obiekt
  71. return self::$objects[$object];
  72. }
  73.  
  74. }
  75.  
  76.  
  77.  
  78. $ext = new Extension();
  79.  
  80. // Łączymy się z bazą danych
  81. $ext->SQL->connect( 'localhost', 'root', '', 'test', false );
  82. // Wywołujemy metodę login()
  83. $ext->Auth->login();
  84.  
  85. ?>


Obiekty przechowywane są w zmiennej statycznej klasy Extension, więc nie są one gubione przy tworzeniu nowych obiektów tej klasy.
Mankamenty:
- Klasa Extension nie może mieć zmiennej publicznej o nazwie identycznej, jak nazwa którejś z twoich klas (chociaż nie wiem czy będziesz potrzebował jakiekolwiek zmienne publiczne w klasie Extension)
- Brak możliwości przekazania parametrów do konstruktora wywoływanej klasy. Można to uzyskać przez zamianę magicznej metody __get() na magiczną metodę __call(), a następnie obiekty tworzyć przy użyciu eval" title="Zobacz w manualu PHP" target="_manual - jednak takie rozwiązanie mi się osobiście nie podoba.
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.10.2025 - 22:01