Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie PHP class
Forum PHP.pl > Forum > PHP
metalog
Witam.
Mam plik z klasą baza są tam fukcje(polacz,zamknij itd) do obsługi bazy danych.
Robię panel też na klasach.
W każdej klasie muszę dziedziczyć klasę baza. ( class cmsArtykuly extends baza{ })
Chodzi oto ze za każdym razem kiedy wykonywana jest jakaś klasa. konstruktor i destruktor łaczy się i rozłancza z bazą co nie jest za wydajne.
  1. <?php
  2. function __construct($db){
  3. $this->polacz($db);
  4.  
  5. }
  6. function __destruct(){
  7. $this->zamknij();
  8.  
  9. }
  10. ?>


Moje pytanie: czy da się to zrobić zeby połaczenie się trzymało i nie trzeba było za każdym razem ładzyć się i rozłanczać
mike
Ogromny błąd, który popełniasz to dziedziczenie za każdym razem po tej klasie.
Nie rób tego. To postępowanie jest pozbawione sensu.
l0ud
Zła metoda, zdecydowanie. Powinieneś na początku utworzyć jeden obiekt łączący się z bazą, później w określony sposób przekazywać jego instancję do każdego innego obiektu wymagającego połączenia z bazą.
metalog
Może ktoś podać przykład takiego rozwiązania?
Albo jakieś wskazówki. ?
dr_bonzo
np. w najprostszej postaci

  1. <?php
  2. $module = new cmsArtykuly( $polaczenie_z_baza )
  3. ?>
metalog
Czy to nie jest ten sam sposób co wyżej? i co ma być(obiekt czy co) w $polaczenie_z_baza
Gecco
skorzystaj z singletona, wtedy bedziesz mial jedna instancje klasy
mike
Cytat(metalog @ 25.06.2008, 15:39:48 ) *
Czy to nie jest ten sam sposób co wyżej? i co ma być(obiekt czy co) w $polaczenie_z_baza
$polaczenie_z_baza to obiekt klasy (w Twoim przypadku) baza. Rozwiązanie jest na tyle inne że tworzysz obiekt (który łączy się z bazą) tylko raz, a później przekazujesz go każdej potrzebującej klasie.
Klasa kiedy dostała obiekt, już nie musi łączyć się z bazą tylko takie połącznie pobrać przekazanego obiektu.
Na przykład:
  1. <?php
  2.  
  3. $polaczenie_z_baza->getConnection();
  4.  
  5. ?>
i na połącznieu działać dalej.
Babcia@Stefa
Spróbuj w sesji zapisywać stan połączenia z bazą danych, jeśli połączenie jest aktywne to nie zostanie ponownie ustanowione oraz zamknięte.
A na końcu kodu będziesz musiał niestety sam zamykać połączenie, chyba że piszesz w OOP to nie będziesz miał problemu.

@edit
Jak widzisz lepsze rozwiązanie, to je przedstaw smile.gif
Sesja jako global też może być

@edit
Nie serializować!
Tylko zapisywać że jest połączenie...
Gdy łączysz się poprzez mysql_connect() to połączenie jest GLOBALNE.

Dziękuję, Babcia@Stefa
dr_bonzo
LOL, w sesji?
- albo nie wiesz ze nie da sie polaczenia z baza zaserializowac
- albo chcesz $_SESSION jako globala uzywac
metalog
Zrobiłem tak jak mówiliście:
na początku index.php:
  1. <?php
  2. $baza=new baza($baza);
  3. $baza->polacz($db);
  4.  
  5. a na końcu:
  6.  
  7. $baza->zamknij();
  8. ?>


w pliku cmsDokumenty.php

  1. <?php
  2. class cmsDokument {
  3. function pokazDokumenty($znacznik){
  4. $zap="zapytanie....";
  5. $baza->zapytanie($zap);
  6. }
  7. }
  8. ?>


w pliku pokazDokumenty.php:
  1. <?php
  2. .... 
  3. $cmsDokument=new cmsDokument($baza);
  4. $cmsDokument->pokazDokumenty($_GET['znacznik']);
  5. ......
  6. ?>


i error Call to a member function zapytanie() on a non-object in [....]/cmsDokumenty.php
l0ud
A gdzie konstruktor tej klasy, co przechwytuje obiekt bazy?

PHP4:

  1. <?php
  2. class cmsDokument {
  3.  
  4. var $baza;
  5.  
  6. function cmsDokument($baza) {
  7. $this->baza = $baza;
  8. }
  9.  
  10. function pokazDokumenty($znacznik){
  11. $zap="zapytanie....";
  12. $this->baza->zapytanie($zap);
  13. //jakaś dalsza akcja
  14. }
  15.  
  16. }
  17. ?>


PHP5:
  1. <?php
  2. class cmsDokument {
  3.  
  4. private $baza;
  5.  
  6. public function __construct($baza) {
  7. $this->baza = $baza;
  8. }
  9.  
  10. public function pokazDokumenty($znacznik){
  11. $zap="zapytanie....";
  12. $this->baza->zapytanie($zap);
  13. //jakaś dalsza akcja
  14. }
  15.  
  16. }
  17. ?>


i wywal to : $baza->zamknij(); na końcu. Nie musisz ręcznie zamykać połączenia.
metalog
Jest ok już nie wyświetla się błąd ze niema funkcji zapytanie lecz nie zwraca mi ta funkcja wyników :| nie wiecie czemu tak może być? pewno to związane jest z obiektem baza.
Cysiaczek
Widzisz tam gdzieś return w tej funkcji? Ja nie, więc pewnie dlatego nic nie zwraca.

Pozdrawiam.
jezoo
a czy mozna w ten sposob, tzn czy to jest bezpieczna metoda polaczenia z baza
  1. <?php
  2. class DatabaseConnector {
  3.  
  4. private static $instance;
  5.  
  6. public function __construct(){}
  7.  
  8. public static function getInstance(){
  9.  
  10. if(!is_object($instance))
  11. $this->instance = new DatabaseConnector();
  12. return $this->instance;
  13. }
  14.  
  15. public function connect(){
  16. pg_connect("host='".Constants::$DB_HOST."'
  17. user='".Constants::$DB_USER."' password='".Constants::$DB_PASSWORD."'
  18. port='".Constants::$DB_PORT."' dbname='".Constants::$DB_NAME."'")
  19. or die("Błąd połączenia z baza danych!");
  20. }
  21.  
  22. public function complete($arg) {
  23. pg_query($arg);
  24. }
  25. }
  26. ?>
wlamywacz
Wydaje mi się że Twoja aplikacja jest źle zaprojektowana i tym samym źle napisana.
bim2
Hmm, trzymaj takie rzeczy (jak baza, obsługa błędów, języki itd.) "globalnie". Czyli tak, żebyś miał do tego dostęp wszędzie. Ja przekazuje je do głównego kontrolera, który dodaje ich instancje przy tworzeniu klasy akcji np.
  1. <?php
  2. $oUser = new Action_User;
  3. $oUser->oDb = $obiekt_bazy;
  4. ?>

To tylko taki przykład, ale powinieneś mieć dostep do bazy tam gdzie potrzebujesz. Nie rób nic na globalu, bo nie ma sensu dawać całej aplikacji dostęp do bazy. :]
metalog
Mam takie cos:
  1. <?php
  2. ....
  3. class cmsLinki {
  4.  
  5. var $prefix='';
  6. var $linkarray=array();
  7. private $baza;
  8.  
  9. public function __construct($baza) 
  10. {
  11. $this->baza = $baza;
  12.  
  13. }
  14.  
  15. function pokazLinki($znacznik){
  16.  
  17. $zap="select * from linki";
  18.  
  19. $this->$baza->zapytanie($zap);
  20. ...
  21. ?>


Wywołanie:

  1. <?php
  2. $baza=new baza();
  3. $baza->polacz($db);
  4. $cmsLinki = new cmsLinki();
  5. $cmsLinki->baza = $baza;
  6. $cmsLinki->pokazlinka($_GET['ida']);
  7. ?>


I wyskakuje mi Fatal error: Cannot access empty propert
mike
Jak cytujesz błed to cytuj go w całości, bo przez niewiedzę możesz obciąć najbardziej istotne informacje.

A co do kodu. Odwołujesz się do pola klasy $baza w sposób publiczny a zmienna ta została zadeklarowana jako prywatna.
To błąd.

Poza tym dlaczego nie przekazałeś bazy w konstruktorze? Przecież po to chyba go tak skonstruowałeś.

Poza tym piszesz niechlujnie. Raz dobrze: $this->baza->...
raz źle $this->$baza->....
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.