Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziedziczenie PHP class
metalog
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


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ć
Go to the top of the page
+Quote Post
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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.
Go to the top of the page
+Quote Post
l0ud
post
Post #3





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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ą.
Go to the top of the page
+Quote Post
metalog
post
Post #4





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


Może ktoś podać przykład takiego rozwiązania?
Albo jakieś wskazówki. ?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


np. w najprostszej postaci

  1. <?php
  2. $module = new cmsArtykuly( $polaczenie_z_baza )
  3. ?>
Go to the top of the page
+Quote Post
metalog
post
Post #6





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


Czy to nie jest ten sam sposób co wyżej? i co ma być(obiekt czy co) w $polaczenie_z_baza
Go to the top of the page
+Quote Post
Gecco
post
Post #7





Grupa: Zarejestrowani
Postów: 23
Pomógł: 4
Dołączył: 22.10.2006

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


skorzystaj z singletona, wtedy bedziesz mial jedna instancje klasy
Go to the top of the page
+Quote Post
mike
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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.
Go to the top of the page
+Quote Post
Babcia@Stefa
post
Post #9





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował Babcia@Stefa 25.06.2008, 20:23:36
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


LOL, w sesji?
- albo nie wiesz ze nie da sie polaczenia z baza zaserializowac
- albo chcesz $_SESSION jako globala uzywac
Go to the top of the page
+Quote Post
metalog
post
Post #11





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


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

Ten post edytował metalog 26.06.2008, 07:42:38
Go to the top of the page
+Quote Post
l0ud
post
Post #12





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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.

Ten post edytował l0ud 26.06.2008, 11:15:42
Go to the top of the page
+Quote Post
metalog
post
Post #13





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


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.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #14





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Widzisz tam gdzieś return w tej funkcji? Ja nie, więc pewnie dlatego nic nie zwraca.

Pozdrawiam.
Go to the top of the page
+Quote Post
jezoo
post
Post #15





Grupa: Zarejestrowani
Postów: 92
Pomógł: 3
Dołączył: 4.04.2006

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


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. ?>
Go to the top of the page
+Quote Post
wlamywacz
post
Post #16





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Wydaje mi się że Twoja aplikacja jest źle zaprojektowana i tym samym źle napisana.
Go to the top of the page
+Quote Post
bim2
post
Post #17





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


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. :]
Go to the top of the page
+Quote Post
metalog
post
Post #18





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 19.07.2006

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


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

Ten post edytował batman 2.07.2008, 10:55:45
Powód edycji: poprawiłem bbcode
Go to the top of the page
+Quote Post
mike
post
Post #19





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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->....
Go to the top of the page
+Quote Post

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: 23.08.2025 - 00:48