Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] OOP - zasięg obiektów
hunter1988
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 31.05.2013

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


Klasa 1
  1. class Database{
  2. private static $datasource='mysql:host=localhost;dbname=X';
  3. private static $username='X';
  4. private static $password='X';
  5. private static $db;
  6.  
  7.  
  8. private function __construct(){}
  9.  
  10. public static function getDB(){
  11. if(!isset(self::$db)){
  12. try{
  13. self::$db=new PDO(self::$datasource,self::$username,self::$password);
  14.  
  15. }
  16. catch(PDOExceptin $e)
  17. {
  18. $error=$e->getMessage();
  19. exit();
  20. }
  21. }
  22. return self::$db;
  23. }
  24.  
  25. }
  26.  
  27.  


Klasa 2
  1. class weryfikacja
  2. {
  3.  
  4. public function checkEmpty($var, $info)
  5. {
  6. if(strlen($var)==0)
  7. {
  8. echo $info;
  9. return false;
  10. }
  11. else
  12. return true;
  13. }
  14. }


Klasa 3

  1.  
  2. class Uzytkownik
  3. {
  4. public $login;
  5. public $haslo;
  6. public $haslo1;
  7. public $email;
  8.  
  9. public function __construct()
  10. {
  11. $this->pdo = Database::getDB();
  12.  
  13. }
  14.  
  15. public function soilHaslo()
  16. {
  17. $this->haslo = md5($this->haslo);
  18. return $this->haslo;
  19. }
  20.  
  21. public function zrobKod()
  22. {
  23. $kod = uniqid(rand());
  24. return $kod;
  25. }
  26. public function test()
  27. {
  28. $weryfikacja = new weryfikacja;
  29. $weryfikacja->checkEmpty('sdadasda','adsasdas');
  30. }
  31.  
  32. public function addUser()
  33. {
  34.  
  35. // zapytanie do bazy sql
  36. }
  37. }
  38.  


Klasa 1 jest odpowiedzialna za połączenie się z bazą danych
Klasa 2 w domyśle weryfikuje dane wprowadzone przez użytkownika,
Klasa 3 wprowadza operacje na danych, tworzy hasło, unikatowy kod do weryfikacji przez email, dodawanie użytkownika do bazy, edycje itp

Mam problem ze zrozumieniem zasięgu zmiennych, metod, obiektów itp. Wiem, co znaczy private, public, protected ale ciężko jest mi ogarnąć to w praktyce, pisze to w przedszkolu gdyż bardzo krótko programuję a jeszcze krócej w PHP, nie chce być tu karcony przez stwierdzenia typu zrób jakiś kurs albo poczytaj książkę, gdyż do takich rozwiązań już sięgałem, rozumiem iż metodą prób i błędów człowiek uczy się najwięcej ale czy ktoś mógłby mi wytłumaczyć jak działa się i jak powinno działać się....

Klasa 1 łączy z bazą, gdy w Klasie 3 chce coś dodać do bazy to w konstruktorze wywołuję połączenie $this->pdo = Database::getDB();
Podobnie chciałbym w metodzie test() użyć metody z Klasy 2, jak powinienem to zrobić ? Powyższy kod działa poprawnie, ale moje pytanie jest takie czy muszę za każdym razem w metodzie tworzyć nowy obiekt danej klasy jeżeli chcę metodę wykorzystać z innej klasy? Da się tworzyć jakoś obiekt w konstruktorze?

Zaznaczę, że połączenie z funkcją statyczną w klasie 1 w klasie 3 jest wykonane poprawnie, podczas gdy nie mam możliwości tworzenia obiektów klasy 2 w konstruktorze klasy 3
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Może być tak (prawie) - co prawda myślałem nad tym by model nie walidował danych ale może w sumie. Ja to ogólnie widzę bardziej tak:

  1. class users extends weryfikacja
  2. {
  3. public function __construct()
  4. {
  5. $this->pdo = Database::getDB(); // rozumiem że $this->pdo jest dziedziczone po "weryfikacja"
  6. // jeśli tak - to może od razu tam w konstuktorze dać $this->pdo = (...)
  7. // wtedy tu konstruktor byłby niepotrzebny ;)
  8. }
  9.  
  10. public function addUser($login,$haslo,$email) // tutaj do konkretnej metody podawaj argumenty - bo konstruktor to kiepski pomysł :)
  11. {
  12.  
  13. $data_rejestracji = time();
  14. if($this->checkMail($this->email,'') && $this->checkEmpty($this->login,'') &&
  15. $this->checkEmpty($this->haslo,'') && $this->checkLogin($this->login,''))
  16. {
  17. $stmt = $this->pdo -> prepare('INSERT INTO `users` (`login`,`haslo`,`mail`,`kod`,`data_rejestracji`) VALUES(
  18. :login,
  19. :haslo,
  20. :mail,
  21. :kod,
  22. :data_rejestracji)');
  23. $stmt -> bindValue(':login', $login, PDO::PARAM_STR);
  24. $stmt -> bindValue(':haslo', $haslo, PDO::PARAM_STR);
  25. $stmt -> bindValue(':mail', $email, PDO::PARAM_STR);
  26. $stmt -> bindValue(':kod', $this->zrobKod(), PDO::PARAM_STR);
  27. $stmt -> bindValue(':data_rejestracji', $data_rejestracji, PDO::PARAM_STR);
  28. $stmt -> execute();
  29.  
  30. }
  31. else
  32. echo "Wprowadzone dane nie są poprawne";
  33. }
  34. public function changePass($new_pass)
  35. {
  36. // i inne funkcje związane tylko z tabelą w bazie users
  37. }
  38. }


Tak jak Ci napisałem najlepiej nic nie kombinować i podać dane metodzie których potrzebuje (IMG:style_emoticons/default/smile.gif)

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: 16.10.2025 - 03:13