Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Błąd w kodzie
Forum PHP.pl > Forum > PHP
tornax
Wróciłem po jakiś dwóch miesiącach do pisania w PHP i natrafiłem na jakąś swoją ociężałość umysłową która nie pozwala mi uporać się z problemem

  1. <?php
  2.  
  3. class MySQL
  4. {
  5. private $hostname;
  6. private $username;
  7. private $password;
  8. private $database;
  9.  
  10.  
  11. // METODY
  12.  
  13. protected function __construct() {}
  14.  
  15. // Singleton
  16. //
  17. // Wymagana argument to nazwa pliku konfiguracyjnego
  18.  
  19. public function singleton() // ($filename)
  20. {
  21. static $instance;
  22.  
  23. if(!isset($instance))
  24. {
  25. $instance = new MySQL;
  26.  
  27. $config_data = parse_ini_file(func_get_arg(0))
  28. or die('plik');
  29.  
  30. $this->parse_config($config_data);
  31. }
  32.  
  33. return $instance;
  34. }
  35.  
  36. private function parse_config($array)
  37. {
  38. $this->hostname = $array[MySQL][hostname];
  39. $this->username = $array[MySQL][username];
  40. $this->password = $array[MySQL][password];
  41. $this->database = $array[MySQL][database];
  42. }
  43.  
  44. }
  45.  
  46. ?>


Podany błąd:

Kod
Fatal error: Using $this when not in object context in c:\www\genesis\classes\MySQL.php on line 30


Odnosi się do tego fragmentu

Kod
$this->parse_config($config_data);


Korzystam z KRASNAL-Serv-2.7, w składzie:
- Apache 1.3.31
- PHP 5.0.2

Oczywiście WinXP

Możliwe że problem leży w ustawieniach ale trochę czasu już spędziłem na kombinowaniu dlatego z góry dzięki za pomoc
UDAT
singleton to chyba jest funkcja statyczna, a zamiast
  1. <?php
  2. $this->parse_config($config_data);
  3. ?>

chciałeś oczywiście dać
  1. <?php
  2. $instance->parse_config($config_data);
  3. ?>

questionmark.gif?
tornax
Zgadza się, właśnie tu leżała moja ociężałość - dzięki wielkie, zabieram sie w końcu dalej do pisania ;]
em1X
Kolego jak zabierasz sie do pisania klas to rob to porzadnie. Wzorzec singleton ma wygladac jak singleton, a nie surówka kodu. No i zawsze pisz tak, zeby kod był skalowalny. Następnym razem, gdy bedziesz pisal jakis projekt, wystarczyc bedzie, ze skopiujesz sobie plik, a on dalej bedzie śmigał:

  1. <?php
  2. class mySQL {
  3.  
  4. private $host, $user, $pass, $db;
  5. private $handle, $dbhandle;
  6. private static $instance;
  7.  
  8. /**
  9. * Prywatny konstruktor
  10. */
  11. private function __construct() {}
  12.  
  13. /**
  14. * Destruktor, np zamykanie polaczenia
  15. */
  16. public function __destruct()
  17. {
  18. @mysql_close($this->handle);
  19. }
  20.  
  21. /**
  22. * Jak przystało na Singleton
  23. * metoda getInstance()
  24. */
  25. public static function getInstance()
  26. {
  27. if (empty(self::$instance))
  28. self::$instance = new mySQL();
  29.  
  30. return self::$instance;
  31. }
  32.  
  33. /**
  34. * łączenie z bazą danych
  35. *
  36. * @throws Exception
  37. */
  38. public function connect()
  39. {
  40. $this->handle = @mysql_connect($this->host, $this->user, $this->pass);
  41. $this->dbhandle = @mysql_select_db($this->db);
  42.  
  43. if (mysql_errno())
  44. {
  45. throw new Exception('Blad mysql (' . mysql_error() . ')');
  46. }
  47. }
  48.  
  49. /**
  50. * Parsowanie pliku konfiguracyjnego.
  51. *
  52. * @throws Exception
  53. */
  54. public function parse_config($file)
  55. {
  56.  $array = @parse_ini_file($file);
  57.  
  58. if (!count($array))
  59. {
  60. throw new Exception('Blad czytania pliku konfiguracyjnego.');
  61. return;
  62. }
  63.  
  64. $this->host = $array[MySQL][hostname];
  65. $this->user = $array[MySQL][username];
  66. $this->pass = $array[MySQL][password];
  67. $this->db  = $array[MySQL][database];
  68. }
  69. }
  70. ?>


dzieki takiemu kodowi, w kazdej aplikacji masz bezposrednią kontrolę nad działaniem klasy, obsługą błędów, itp:

  1. <?php
  2. $sql = mySQL::getInstance();
  3.  
  4. try {
  5.  $sql->parse_config('config.ini');
  6. }
  7. catch (Exception $e) {
  8.  // obsługa błędu w razie
  9.  // błędnej konfiguracji
  10. }
  11.  
  12. try {
  13.  $sql->connect();
  14. }
  15. catch (Exception $e) {
  16.  // obsługa błędu
  17.  // w razie błędu połączenia
  18. }
  19.  
  20. // dalsze działanie skryptu
  21. // mozesz dalej rozszerzyc tą klasę o metody wywoływania zapytań
  22. // sql, filtrowanie danych.. mozliwosci są nieskończone, a zabawa wspaniała
  23. ?>


powodzenia offtopic.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.