ďťż

[PHP] Problem z klasą - obiektowe PHP

       

Podstrony


telcocafe

Witam. Zacząłem się uczyć obiektowego PHP i napotkałem pewien problem:
<?php class DBMySQL { public $host; public $login; public $haslo; public $dbnazwa; public $connection; public function aktywny() { if ($this->connection) return true; else return false; } public function polaczenie() { return $this->connection; } public function polacz() { $this->connection = mysql_connect($this->host, $this->login, $this->haslo); } public function rozlacz() { mysql_close($this->connection); } } $mysql = new DBMySQL; $mysql->host = 'localhost'; $mysql->login = 'root'; $mysql->haslo = 'krasnal'; $mysql->dbnazwa = 'krasnal'; if($mysql->aktywny == true) print 1; else print 0; $mysql->polacz(); if($mysql->aktywny == true) print 1; else print 0; $mysql->rozlacz(); if($mysql->aktywny == true) print 1; else print 0; ?>

Chodzi o trzy warunki na samym dole:
if($mysql->aktywny == true) print 1; else print 0;

Powinny mi się wyświetlić cyferki 010, a tym czasem otrzymuję 000.
/Połączenie z MySQL działa poprawnie.

//edit. jeszcze jedno.
W FAQ znalazlem, że do klasy odwołujemy się klasa::cos;
Czym różni sie :: od ->
Użytkownik DJ Mentos edytował ten post 14 kwiecień 2009, 16:27


z php.net, mysql_connect:

Zwracane wartości

Zwraca identyfikator połączenia MySQL w przypadku sukcesu, lub FALSE w przypadku porażki.

Wiecej: http://pl.php.net/mysql_connect
Także nie zwróci Ci true ;)

no fakt. ale napisane, że jak nie połączy to daje False.
Więc przerobiłem:
public function aktywny() { if (!$this->connection) return false; else return true; }
Doszedł "not" i zmieniona kolejność i teoretycznie powinno działać, a dalej same zera.


Czym różni sie :: od ->
Za pomocą -> odwołujesz się do obiektu (instancji klasy), zaś za pomocą :: do elementów samej klasy, np. statycznych metod, stałych... Jest różnica między $obiekt->zmienna a Klasa::JAKAS_STALA

Widzę niekonsekwencję w kodzie. Przecież aktywny() jest metodą, a nie własnością! W funkcji polacz() po prostu ustaw:$this->aktywny = true; //albo false, jeśli połączenie nie powiedzie sięZaś funkcję aktywny() zamień na zmienną publiczną.

Włącz wyświetlanie wszystkich błędów - E_STRICT wraz z E_ALL i będziesz widział, co jest nie tak.
Użytkownik Ferrari edytował ten post 14 kwiecień 2009, 19:49


przy używaniu klasa::funkcja nie musisz tworzyć obiektu (kiedy nie masz zmiennych w klasie) :) Ale jest to bezsensowne i mija się z celowością objektowego PHP. Hmm...

EUREKA!!!

if($mysql->aktywny() == true) print 1; else print 0;

Odwołujesz się do funkcji, nie do wskaźnika obiektu, stąd problem. Proponuję dorobic do funkcji rozlacz: $this->connection = false; gdyż mysql_close zwraca TRUE w wyniku powodzenia akcji rozłączenia
Użytkownik Petermechanic edytował ten post 14 kwiecień 2009, 19:53
tak... "literówka" :D

ale 011 też mnie nie satysfakcjonuje. :)
skoro mysql_close() zamyka połączenie to dlaczego aktywny() wciaz zwraca true?

//edit. dziękuje :D juz mi odpowiedziałeś.
Użytkownik DJ Mentos edytował ten post 14 kwiecień 2009, 19:55
przeczytaj powyżej:
Proponuję dorobic do funkcji rozlacz: $this->connection = false; gdyż mysql_close zwraca TRUE w wyniku powodzenia akcji rozłączenia

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.