Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Class w Php i dziedziczenie ?
Forum PHP.pl > Forum > Przedszkole
jarekhunter
Witam wszystkich.
Mam kilka klas napisanych w php.
załóżmy że klasa db.php - zajmuję się operacjami na bazie danych mysql

Dodatkowo mam klasę i chcę by to wyglądało tak.
  1. include_once 'db.php';
  2. include_once 'newsy.php';
  3. include_once 'komentarze.php';
  4.  
  5. $DB=new DB_MAIN([HOST],[USER],[HASLO],[BAZA]);
  6. $obj_newsy=new newsy_main($DB);
  7. $obj_komentarze=new komentarze_main($DB);

Przykładowo newsy wyglądają tak
  1. class newsy_main extends DB_MAIN
  2. {
  3. function __construct($baza)
  4. {
  5. //
  6. }
  7. function show_newsy()
  8. {
  9. $this->query("jakies zapytanie");
  10. }
  11. }


i teraz np. wywołuję to normalnie
  1. $newsy_all=$obj_newsy->show_newsy();


Jak muszę napisać taki kod by to działało mniej więcej w taki sposób chciał bym uniknąć w środku zmiennej itp. i odwoływać się np.
  1. $this->baza->query("Zapytanie");


w komentarzach chce podobnie, nie chce za każdym razem podawać danych i łączyć się z bazą skoro zrobiłem to na samym początku..
Dziękuję serdecznie za pomoc i wskazówki..
darko
To nie ma sensu, albo dziedziczysz po klasie DB_MAIN i przekazujesz jej parametry z konstruktora klas wyprowadzanych:
// w klasach potomnych:

  1. function __construct($HOST,$USER,$HASLO,$BAZA)
  2. {
  3. parent::__construct($HOST,$USER,$HASLO,$BAZA);
  4. }
  5. // i
  6. function show_newsy()
  7. {
  8. $this->query("jakies zapytanie");
  9. }
  10. // ...


albo przekazujesz instancję klasy DB_MAIN:
  1. // (...)
  2. private $_db;
  3. function __construct(DB_MAIN $db)
  4. {
  5. $this->_db = $db;
  6. }
  7. // i
  8. function show_newsy()
  9. {
  10. $this->_db->query("jakies zapytanie");
  11. }
  12. // ...
jarekhunter
No właśnie nie wiedziałem jak to rozwiązać.
Jak na razie mam to jak ty w przykładzie nr2.
Bardziej by mi odpowiadał przykład 1, tyle że nie chciał bym za każdym razem podawać danych do łączenia się z bazą danych.
Ponieważ klient raz już jest połączony i wysłane są kodowania itp. chciał bym po prostu uniknąć kolejnych połączeń, a kolejne klasy korzystają z 1 połączenia, tak jest najwygodniej.

Czy nie można np. klasy db przesłać do klasy dziedziczącej by tamta nie łączyła się 2 raz questionmark.gif
darko
Można i tak właśnie masz zrobione, w przykładzie nr 2 nie łączysz się na nowo, bo jesteś już połączony, wywołujesz tylko metodę query(). W ogóle nie wiem w czym problem ? W sumie takim razie niepotrzebnie Twoje klasy potomne dziedziczą z klasy DB_MAIN, skoro przekazujesz im instancję tejże klasy, to nie muszą dodatkowo po niej dziedziczyć.
jarekhunter
w moim przypadku nie dziedziczą, po prostu chciałem to rozwiązać w inny sposób

U mnie deklaracja instancji wyglądała tak

  1. var $db_baza;
  2. function __constructor($baza)
  3. {
  4. $this->db_baza=$baza;
  5. }


I nie podpowiadało mi eclipse co znajduję się w klasie DB, tylko musiałem cały czas klepać.
a gdy to robię tak jak ty pokazałeś czyli najpierw Rodzaj zmiennej później zmienna to mi podpowiada.

Tylko pytanie czy ten sposób w php4 działa questionmark.gif
jak również coś w tym stylu
  1. private function jakas()
  2. {
  3. //
  4. }

questionmark.gif czy tylko w php 5 questionmark.gif
Pytam ponieważ ja mam na serwerze php5 ale pracować to będzie na php 4 i coś, także nie chciał bym niemiłych niespodzianek..
Przyznam że nawet nie wiedziałem że php obsługuję deklaracje zmiennych, a jednak tak, tylko czy od wersji 5 czy w php4 również.

darko - czy inne typy zmiennych przechodzą tak samo jak w c questionmark.gif czy już nie np.
int $zm; itp ?
darko
type hinting zostało wprowadzone od php 5 niestety, w ogóle zapraszam do lektury
type hinting można także stosować jak najbardziej dla typów prostych bool, float, integer, double itd. Natomiast nie wiem jak to jest z private w php 4, bo w php piszę od nieco ponad roku...

Pozdrawiam.
jarekhunter
Spoko darko, ja się php nie uczyłem, dlatego z tąd brak mi informacji, ale język php jest bazowany na c, c++,java itp. a te języki dobrze znam dlatego małe zmiany które są tu wprowadzone mi nie przeszkadzają..
Brak mi tylko czasami elastyczności i swobody którą niestety php ogranicza w pewien sposób, ale ładnie ten język rozbudowują.
Dzięki serdeczne i pozdrawiam.
Crozin
Cytat
ype hinting można także stosować jak najbardziej dla typów prostych bool, float, integer, double itd.
W PHP nie można... działa to jedynie dla obiektów i tablic.
Cytat
Natomiast nie wiem jak to jest z private w php 4
W PHP4 modyfikatory zasięgu nie istniały.
darko
Cytat(Crozin @ 28.01.2010, 19:11:08 ) *
W PHP nie można... działa to jedynie dla obiektów i tablic.

~Crozin - bzdura, sam sprawdź:
  1. function x(boolean $x, integer $y, float $z) {
  2. echo $x." ".$y. " ".$z;
  3. }
  4. x('d','da',1);


Cytat
Catchable fatal error: Argument 1 passed to x() must be an instance of boolean, string given, called in /var/www/robocze/brtest.php on line 5 and defined in /var/www/robocze/brtest.php on line 2


Chociaż wg manuala nie powinno hulać, albo "zapomnieli" dodać:
Cytat
Type Hinting

PHP 5 introduces Type Hinting. Functions are now able to force parameters to be objects (by specifying the name of the class in the function prototype) or arrays (since PHP 5.1). However, if NULL is used as the default parameter value, it will be allowed as an argument for any later call.

[za:] http://php.net/manual/en/language.oop5.typehinting.php

Ciekawostka, z którą już się kiedyś spotkałem, kod:
  1. function x(integer $y, float $z, boolean $x) {
  2. echo $x." ".$y. " ".$z;
  3. }
  4. x(11,12.12,true);

i komunikat:
Cytat
Catchable fatal error: Argument 1 passed to x() must be an instance of integer, integer given, called in /var/www/robocze/brtest.php on line 5 and defined in /var/www/robocze/brtest.php on line 2

Chyba jednak ~Crozin właśnie dlatego ma rację.
jarekhunter
No to wszystko wiem.
Dziękuję panowie 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.