Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Pytanie o klase mysqli
Forum PHP.pl > Forum > Przedszkole
edekk
Witam,
Chciałbym napisać pewną część swojego edukacyjnego projektu w ujęciu obiektowym. Korzystam z bazy danych MySQL, więc nie muszę pisać klasy obsługującej tę bazę osobno, tylko chcę skorzystać z wbudowanej klasy mysqli. Mam jednak problem już na starcie, bo nie wiem, jak ta klasa może być dziedziczona w innych. Przykładowo mam klasę:

Kod
class Przykladowa_klasa (

)


w której chciałbym wykonać pewne operacje na bazie danych. Jak w takiej sytuacji zainicjować dziedziczenie mysqli? Wpisać po prostu Przykładowa klasa extends mysqli? Czy jeśli taki zabieg jest możliwy, to w jaki sposób tworzy się egzemplarz klasy wewnątrz tej Przykładowa_klasa? Jeśli wywołuję mysqli w innym miejscu, wystarczy, że wpiszę:

Kod
$polaczenie = @new mysqli('host', 'uzytkownik', 'haslo', 'nazwa bazy');


czy można użyć tego podobnie wewnątrz innej klasy (chodzi o operator new). Jeśli tak to gdzie najlepiej to zrobić?

Jednocześnie chciałbym zadać jeszcze kilka innych pytać związanych z php obiektowym. Analizowałem sobie przez pewien czas kod obiektowy z różnych źródeł, gdzie jest on umieszczany bezpłatnie i nie rozumiem pewnych mechanizmów często stosowanych (przepraszam, jeśli pytania sa lamerskie, ale niestety w książkach które przerabiam jest ogólny zarys idei OOP, a w praktyce napotykam na niezrozumiałe fragmenty), np.

Kod
class klasa1
{
    public  $imie;
    public  $nazwisko;
    
    function __construct($imie,$nazwisko)
    {
        $this->imie=$imie;
        $this->nazwisko=$nazwisko;
    }
    
    function  wyswietl()
    {   echo " klasa 1"."\n";
        echo "$this->imie"."\n"."$this->nazwisko"."\n";
    }
    
}



Nurtuje mnie to, co się dzieje w konstruktorze. Kumam kod do momentu, kiedy po odwołaniu się do pól $imie, $naziwsko wewnątrz klasy za pomocą $this, przypisuje sie je do zmiennej $imie jeszcze raz za pomocą operatora "=". Czy ktoś mógłby mi wytłumaczyć dlaczego stosuje się taki zabieg?

Ponadto chciałbym zapytać, czy zmienne w metodach danej klasy mogą przyjmować za swoje parametry tylko zmiennie wcześniej zadeklarowane jako metody klasy, czy także zmienne niezwiązane z klasą i pochodzące z innej części skryptu?
Kicok
Cytat
Jak w takiej sytuacji zainicjować dziedziczenie mysqli? Wpisać po prostu Przykładowa klasa extends mysqli?

Tak. Przykładowy kod:
  1. <?php
  2.  
  3. class PrzykladowaKlasa extends MySQLi
  4. {
  5. }
  6.  
  7.  
  8. $przyklad = new PrzykladowaKlasa( 'host', 'uzytkownik', 'haslo', 'nazwa bazy' );
  9. echo $przyklad->serverInfo();
  10. $przyklad->close();
  11.  
  12. ?>

Klasa PrzykladowaKlasa zawiera teraz całą funkcjonalność klasy MySQLi ( http://pl2.php.net/manual/pl/class.mysqli.php )

Jeśli natomiast funkcjonalność oferowana przez klasę MySQLi ci nie wystarcza, to dodajesz sobie własne metody:
  1. <?php
  2.  
  3. class PrzykladowaKlasa extends MySQLi
  4. {
  5. public function nowaFunkcjonalnosc()
  6. {
  7.  return 'Nie przychodzi mi teraz nic do glowy ;]';
  8. }
  9. }
  10.  
  11.  
  12. $przyklad = new PrzykladowaKlasa( 'host', 'user', 'pass', 'name' );
  13. echo $przyklad->nowaFunkcjonalnosc();
  14. echo $przyklad->getClientVersion();
  15.  
  16. $przyklad->close();
  17.  
  18. ?>



Jeśli utworzysz w swojej PrzykladowejKlasie metodę, która jest już zadeklarowana w klasie MySQLi, to zasłoni ona metodę klasy rodzica. Tyczy się to także konstruktorów i destruktorów. Na przykład jeśli chcesz mieć w swojej klasie konstruktor, a zarazem chcesz wywoływać konstruktor klasy MySQLi, musisz wywołać go ręcznie:
  1. <?php
  2.  
  3. class PrzykladowaKlasa extends MySQLi
  4. {
  5. public function __construct( $host='localhost', $user='root', $pass='', $name='test', $port=3306, $socket=null )
  6. {
  7. // Wykonujesz jakieś własne instrukcje
  8. echo 'Zaraz nawiążę połączenie z bazą danych!';
  9.  
  10. // Wywołujesz konstruktor rodzica ręcznie
  11. parent::__construct( $host, $user, $pass, $name, $port, $socket );
  12. }
  13. }
  14.  
  15.  
  16. $przyklad = new PrzykladowaKlasa( 'host', 'user', 'pass', 'name' );
  17.  
  18. ?>



Tak w skrócie wygląda dziedziczenie. Ty najprawdopodobniej jednak nie potrzebujesz dziedziczenia, a zwykłego przekazania obiektu do klasy. Przykład:
  1. <?php
  2.  
  3. class User
  4. {
  5. private $db;
  6.  
  7. private $name;
  8. private $surname;
  9.  
  10.  
  11. public function __construct( MySQLi $db )
  12. {
  13. // $this->db jest widoczna w obrębie całej klasy i będzie dostępna aż do końca jej życi
    a
  14. // $db jest dostępna tylko w obrębie tej metody (poczytaj o zasięgu zmiennych - zasada taka sama jak przy funkcjach)
  15. $this->db = $db;
  16. }
  17.  
  18. public function setName( $name )
  19. {
  20. $this->name = $name;
  21. }
  22.  
  23. public function setSurname( $surname )
  24. {
  25. $this->surname = $surname;
  26. }
  27.  
  28.  
  29. public function save()
  30. {
  31. $stmt = $this->db->prepare( 'INSTER INTO `users` ( `name`, `surname` ) VALUES ( ?, ? )' );
  32. $stmt->bind_param( 'ss', $this->name, $this->surname );
  33.  
  34. $stmt->execute();
  35. }
  36. }
  37.  
  38. ?>
nickkk
Dziękuję za szybką odpowiedź. Prawie zrozumiałem, nawet przepisałem niektóre fragmenty strony, ale mam problem z wykorzystaniem odziedziczonej klasy w potomku. Mam klasę A:

Kod
class A extends MySQLi {

//jakies metody

}


Podczas tworzenia instancji klasy A wykonuję zapytania na bazie danych i wszystko działa no. :

Kod
$rejestracja = new Rejestracja($db_host, $db_user, $db_haslo, $db_name)
$sql = "SELECT * FROM users WHERE u_login = BINARY '$login'";
$zapytanie = $rejestracja->query($sql);
$row = $zapytanie->num_rows;


I wynik jest prawidłowy. Nie wiem jednak jak wykonać podobną operacją wewnątrz klasy A jako metodę (gdybym np. chciał stworzyć osobną metodę sprawdzająca czy użytkownik istnieje). W jaki sposób wykonać takie zapytanie wewnątrz klasy? Mam taką metodę ale ona nie działa:



Kod
class A{

    $this->db_uchwyt = $db_uchwyt;
    $this->db_sql = $db_sql;
    $this->num_rows = $num_rows;
    $this->login = $login;

public function row_login($db_sql, $db_uchwyt, $login){
    $db_sql = "SELECT * FROM users WHERE u_login = BINARY '$login'";
    $db_uchwyt->query($db_sql);
    $num_rows = $db_uchwyt->num_rows;
}

}


do tego problem jest taki, że przy próbie odwołania do tej metody ($this->row_login($db_sql, $db_uchwyt, $login)) w innej metodzie wewnatrz klasy wyskakuje blad:

Kod
Fatal error: Call to a member function query() on a non-object in C:\Program Files\WebServ\httpd


Błąd wskazuje na linię z $db_uchwyt;
nickkk
Witam,
Problem już został rozwiązany. Polegał na błędach, głównie w odwoływaniu się do obiektów. Temat nieaktualny. Pozdrawiam!
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.