Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] problem z klasą, i zapisywaniem zmiennych
BugsBunny
post
Post #1





Grupa: Zarejestrowani
Postów: 206
Pomógł: 4
Dołączył: 2.04.2005

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


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





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


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





Grupa: Zarejestrowani
Postów: 206
Pomógł: 4
Dołączył: 2.04.2005

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


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 :/
Go to the top of the page
+Quote Post
deirathe
post
Post #4





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


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

Ten post edytował deirathe 1.07.2007, 00:15:02
Go to the top of the page
+Quote Post
BugsBunny
post
Post #5





Grupa: Zarejestrowani
Postów: 206
Pomógł: 4
Dołączył: 2.04.2005

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


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]
Go to the top of the page
+Quote Post
Kicok
post
Post #6





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

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


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. ?>


Ten post edytował Kicok 1.07.2007, 09:06:07
Go to the top of the page
+Quote Post
BugsBunny
post
Post #7





Grupa: Zarejestrowani
Postów: 206
Pomógł: 4
Dołączył: 2.04.2005

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


Przeceiż tworzę obiekt w funkcji start()

coś nadal nie tak (IMG:http://forum.php.pl/style_emoticons/default/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] => )

Ten post edytował BugsBunny 1.07.2007, 09:44:15
Go to the top of the page
+Quote Post
Kicok
post
Post #8





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

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


Cytat
Przeceiż tworzę obiekt w funkcji start()


Jakoś nie zauważyłem definicji metody start() w żadnym z powyższych kodów (IMG:http://forum.php.pl/style_emoticons/default/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()

Ten post edytował Kicok 1.07.2007, 12:17:58
Go to the top of the page
+Quote Post
BugsBunny
post
Post #9





Grupa: Zarejestrowani
Postów: 206
Pomógł: 4
Dołączył: 2.04.2005

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


O Lol ale ze mnie gapa (IMG:http://forum.php.pl/style_emoticons/default/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
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: 19.12.2025 - 18:16