Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] problem z klasą
Forum PHP.pl > Forum > Przedszkole
BugsBunny
oto moja klasa
  1. <?php
  2. private $_arData;
  3.  
  4. //......
  5.  
  6. private function __construct(){
  7. print_r ($this->_arData);
  8. if(!isset($this->_arData)){
  9. throw new Exception('Brak danych potrzebnych do zainicjowania połączenia');
  10. }
  11. $this->_hConn = @mysql_connect($this->_arData['host'],$this->_arData['user'],$this->_arData['pass']);
  12.  
  13. if(mysql_select_db($this->_arData['db']) )
  14.  throw new Exception('Nie można wybrać bazy danych'.mysql_error);
  15.  
  16. }
  17.  
  18. public static function connect($arData){
  19.  
  20. static $objDb;
  21.  
  22. if(!isset($objDb))
  23.  $objDb = new Db;
  24. $this->_arData = $arData;
  25. print_r ($this->_arData);
  26. return $objDb;
  27. }
  28. ?>


I jakos nie działa mi to
$this->_arData = $arData;

bo gdy chce wyświetlic sobie tablice przez
print_r($this->_arData); nic nie wyświetla :/

[+] edit
Dodaje tag, aby temat był zgodny z forum Przedszkole,
ponieważ już padły odpowiedzi. Na przyszłość proszę
pamiętać o tym, inaczej temat zostanie zamknięty.
---
~strife
deirathe
Bo zmiennych private nie można wyświetlić o ile się nie myle- takie zabezpieczenie, zmień na public i zobacz czy wyświetli, jeżeli tak no to wszystko wporządku jest
BugsBunny
Ciągle to samo -> czyli nic

pozatym kiedy wywołuje funckje connect

$db = Db::connect();

to wyrzuca mi wyjątek
Brak danych potrzebnych do zainicjowania połączenia

czyli nie przechodzi próby isset :/
deirathe
Co do wyświetlania private- tylko mi się zdawało ;P
Ja u siebie nadałem jej wartość początkową 0 i przeszło, oczywiście constructor zmieniłem na public bo wywalało mi błąd
BugsBunny
Tak ją wywołuję
  1. <? 
  2. // daane z config
  3. $db['host'] = '******';
  4. $db['pass'] = '******';
  5. $db['user'] = '*****';
  6. $db['db'] = '******';
  7.  
  8. //classtest.php
  9. require_once 'class.db.php';
  10.  
  11. try{
  12. $db = Db::connect($db);
  13. }
  14.  
  15. catch(Exception $e){
  16. print_r ($e->getMessage());
  17. }
  18. ?>

pozatym jeżeli w funkcji connect umieszczę

  1. <?php
  2. print_r($arData);
  3. ?>

to wszystko jest OK
a jak ją przypisuje do $this->_arData to tak jakby nie istniała :/

a może cos z tym że funkcja jest statyczna ?

No więc chodzi o to ze funkcja jest statyczna :/ Bo zrobiłem normalnie i działa. Może funkcja statyczna nie moze zapisaywac do zmiennych w klasie. Jak więc to rozwiązać?

hmm to teraz turdno mi to zrozumieć

funkcja w klasie
  1. <?php
  2. public function connect($arData){
  3. $this->_arData = $arData;
  4.  
  5. return $this->_arData;
  6. }
  7.  
  8. i wyśeitlam przez print_r
  9. tak wyglada tablica $arData
  10. [b]Array ( [host] => localhost [pass] => krasnal [user] => root [db] => homepage )[/b]
  11.  
  12. a tak to co zwraca funkcja connect
  13.  
  14. [b]Db Object ( [_hConn] => [_arData] => Db Object *RECURSION* ) [/b]
  15.  
  16. ...
  17.  
  18. początek klasy
  19. [/b]
  20. ?>
class Db{

public $_hConn;
public $_arData;[php]
Kicok
Najprościej rzecz ujmując $this można używać, gdy został utworzony obiekt klasy. Jeśli chcesz operować na metodach statycznych, to musisz użyć self::

  1. <?php
  2.  
  3. class klasa
  4. {
  5. private static $zmienna;
  6.  
  7.  
  8. public static function metoda1( $wartosc )
  9. {
  10. self::$zmienna = $wartosc;
  11. }
  12.  
  13. public static function metoda2()
  14. {
  15. echo 'Test: ' . self::$zmienna . '<br>';
  16. }
  17. }
  18.  
  19.  
  20. //klasa::$zmienna; - Takie wywołanie wywali Fatal Error - zmienna klasowa jest prywatna
  21. klasa::metoda2(); // Wyświetli samo "Test: " - zmienna klasowa nie ma jeszcze wartości
  22.  
  23. klasa::metoda1( 'foo' );
  24. klasa::metoda2(); // Wyświetli: "Test: foo"
  25.  
  26. ?>
BugsBunny
Przeceiż tworzę obiekt w funkcji start()

coś nadal nie tak dry.gif
  1. <?php
  2. class Db{
  3.  
  4. public $_hConn;
  5. private static $_arData;
  6.  
  7. private function __construct(){
  8.  
  9. }
  10. public static function connect($arData){
  11. self::$_arData = $arData;
  12.  
  13. return self::$_arData;
  14. }
  15.  
  16. public static function Start(){
  17.  
  18. static $objDb;
  19.  
  20. if(!isset($objDb))
  21.  $objDb = new Db;
  22.  
  23. return $objDb;
  24. }
  25. ?>

a wywołuje tak
  1. <?php
  2. print_r($db); // ( 1 )
  3.  
  4. $db = Db::start();
  5. try{
  6. print_r ($db->connect($db)); // ( 2 )
  7.  
  8. }
  9. catch(Exception $e){
  10. print_r ($e->getMessage());
  11. }
  12. ?>


punkt pierwszy wyswietla tak jak powinno a pkt 2
Db Object ( [_hConn] => )
Kicok
Cytat
Przeceiż tworzę obiekt w funkcji start()


Jakoś nie zauważyłem definicji metody start() w żadnym z powyższych kodów smile.gif



Cytat
punkt pierwszy wyswietla tak jak powinno a pkt 2
Db Object ( [_hConn] => )


Przecież dobrze się wyświetla. W linijce 6 przekazujesz metodzie connect() zmienną $db, która jest obiektem utworzonym w linijce 4. Tak więc do prywatnej zmiennej $_arData zapisywana jest referencja obiektu klasy Db.
Klasa Db ta ma tylko jedną publiczną zmienną, więc tylko tyle wyświetliła funkcja print_r()
BugsBunny
O Lol ale ze mnie gapa biggrin.gif Nastąpił konflikt nazw. bo stworzony obiekt nazwałem $db i dane które podawałem do połączenia też $db. Już wszystko działa. Dzięki za pomoc
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.