![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 5.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam !!!
Zacznę od tego że jestem tutaj całkiem nowy więc proszę o wyrozumiałość jeśli palnę coś nie zgodnego z zasadami panującymi na tym forum. Do tej pory zajmowałem się programowaniem w PHP4. Głównie były to informacje pochodzące bezpośrednio z MySQL-a. Teraz zmiana serwera skłoniła mnie do przesiadki na PHP5. Pierwszy przykład i pojawiły się już pierwsze pytania.. Otóż przypuśćmy ze mamy taką klasę. 1. CODE class config { public $settings=array(); function __construct () { $this->settings = $this->get_settings() } function get_settings() { return parse_ini_file("config.ini", TRUE); } } Prosta klasa która będzie pobierała dane z pliku konfiguracyjnego i je zapamiętywała. Teraz załóżmy istnienie drugiej która będzie miała za zadanie połączyć się z bazą MySQL-a. Mam do wyboru dwa warianty z czego jeden i drugi funkcjonują identycznie. 2a. CODE class db { public $connect=0; function __construct() { $ob = new config(); $this->connect = mysql_connect($ob->settings['host'],$ob->settings['user'],$ob->settings['passwd']); mysql_select_db($ob->settings['db']); } } 2b. CODE class db extends config { public $connect=0; function __construct() { $ob = config::get_settings(); $this->connect = mysql_connect($ob['host'],$ob['user'],$ob['passwd']); mysql_select_db($ob['db']); } } Pytanie teraz brzmii który jest poprawny merytorycznie - zgodnie z zasadami. CZy sensowne jest tworzenie w takiej sytuacji nowego obiektu czy poprostu wywołanie funckji z klasy bez tworzenia obiektu.?? Acha doam że założenia będą jeszcze kolejne. Tzn następne klasy będą korzystać z w/w. Np Klasa strona będzie korzystać i z db i z config. Klasa validator tylko z config. Klasa Login będzie i z db i config ... itd. Doradźcie cosik... Ten post edytował szumigt 5.10.2007, 11:18:05 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 2.10.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Obie metody są ok, wszystko zależy od projektu.
Błędem natomiast jest trzymanie danych do autoryzacji w pliku ini, chyba, że to tylko dla przykładu (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 5.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie to nie było dla przykładu. Dlaczego jest błędem?? Jeśli nadam mu odpowiednie prawa a po za tym przecież mogę go umieścić po za katalogiem strony i tak nik z zewnątrz się do niego nie dostanie...
No dobrze, a jak wygląda sprawa z optymalizacją. Czy pod tym względem jedna czy druga metoda nie zabiera np więcej zasobów serwera ... (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Chyba nie - obie metody są normalne. jedyna różnica to to, że w drugim przykłądzie robisz kopie tablicy. Moższ zrobić referencję. Generalnie rób tak jak Ci wygodniej.
Pozdrawiam. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 5.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
To teraz inaczej. Przyjmijmy że klasa config ma taką samą treść ale teraz klasa db ma postać:
CODE class db { public $connect=0; public $result=0; public $rows=array(); public $names=array(); function __construct() { $ob = new config(); $this->connect = mysql_connect($ob->settings['host'],$ob->settings['user'],$ob->settings['passwd']); mysql_select_db($ob->settings['db']); } function fetch_rows($query) { $this->result = mysq_query($query); $this->rows = mysql_fetch_assoc($this->result); } function fetch_names() { for($i=0;$i<mysql_num_fields($this->result);$i++) $this -> names[$i] = mysql_field_name($this->result, $i); } } Teraz jest ona większa i ma więcej właściwości. Jeśli teraz powiększamy nasz projekt przez kolejną klasę.... CODE class Page { public $menu = array(); public $dbase; function __construct() { $this -> dbase = new db(); } function get_menu(&$dzial) { $this -> dbase -> fetch_rows("SELECT * FROM cms WHERE parent = $dzial"); while($this -> dbase -> fetch_rows() ) { $this->menu[] = $this -> dbase -> rows; } } } To tym razem tworzę w pamięci większy obiekt a tym samym więcej zajmuje on miejsca w pamieci. Koniec z końcem i tak korzystam tylko z jednej metody pobierającej dane ... |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 2.10.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wszystko zależy od techniki programowania. Ale jeśli klasa ma mieć tylko jedną metodę, to może wystarczy ci zwykła funkcja. Nie do wszystkiego na siłe trzeba robić klasy.
W podanym przykładzie klasa Config pobiera tylko dane, jeśli pobiera ona tylko dane do bazy, to lepiej zaimplementować tą funkcje, jak metodę klasy db. Jeśli masz w klasie Page, wiele metod, które korzystają z obiektu db, to lepiej zrobić dziedziczenie, lub zainicjować ją w konstruktorze. Tylko weż pod uwagę, że jeżeli korzystać z wielu klas, które bedą używać klasy db, to Twoja metoda nie dość, że zmiejszy czytelność kodu, to dodatkowo możę zwiększyć ilość wykorzystanej pamięci. Dlatego w tym przypadku lepiej zainicjować klase db gdzieś na początku, aby później używać już tylko jej identyfikatora. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 5.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko zależy od techniki programowania. Ale jeśli klasa ma mieć tylko jedną metodę, to może wystarczy ci zwykła funkcja. Nie do wszystkiego na siłe trzeba robić klasy. W podanym przykładzie klasa Config pobiera tylko dane, jeśli pobiera ona tylko dane do bazy, to lepiej zaimplementować tą funkcje, jak metodę klasy db. No na dobrą sprawę to tak. Ta klasa ma tylko za zadanie pobrac dane do konfiguracji serwisu. Międzyinnymi ilość artykułów na stronę czy Tytuł aplikacji... Moze by warto pomyslec nad tylko jedną funkcją ... Jeśli masz w klasie Page, wiele metod, które korzystają z obiektu db, to lepiej zrobić dziedziczenie, lub zainicjować ją w konstruktorze. Tak w klasie page będą jeszcze ze cztery metody korzystające z klasy db... Ale przecież inicjacja obiektu db jest tutaj w konstruktorze... (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Dlatego w tym przypadku lepiej zainicjować klase db gdzieś na początku, aby później używać już tylko jej identyfikatora. Czy inicjacja w konstruktorze może tak zostać ... Mam prośbę. Mogę Ci wysłać na maila kod wszystkich klas. Rzuciłbyś okiem co jest nie tak i ewentualnie coś zasugerował... (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 2.10.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Jeśli nie masz tego za dużo, to mogę rzucić okiem.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 5.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@szumigt
PHP5? A gdzie deklaracja zasięgu metod, to musi być podane. To nie jest Java, która ma jeszcze jeden zasięg. |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Ja sie na chwilę wtrącę.
@Sedziwoj - jak nie ma podanego zakresu widoczności przy metodzie, to automatycznie jest to metoda publiczna i dla php5 nie jest to bląd. Pozdrawiam. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@Sedziwoj - jak nie ma podanego zakresu widoczności przy metodzie, to automatycznie jest to metoda publiczna i dla php5 nie jest to bląd. Nie, nie jest to błąd (w znaczeniu interpretera PHP). Ale musi być bo nie innego zasięgu, a z tymi domyślnymi rzeczami to różnie bywa, więc dlatego powinno się podawać zasięg. Bez to pozostałość po PHP4 i tyle można moim zdaniem o tym powiedzieć. EDIT małe dopowiedzenie. Ten post edytował Sedziwoj 11.10.2007, 15:13:44 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 49 Pomógł: 0 Dołączył: 9.09.2002 Skąd: Pszczyna Ostrzeżenie: (0%) ![]() ![]() |
Moim skromnym zdaniem
z formalnego punktu widzenia oba podejścia są prawidłowe natomiast funkcjonalnie w opisywanym przypadku dziedziczeni klasy do obsługi bazy danych po klasie config nie jest dobrym rozwiązaniem. Dziedziczenie stosuje się raczej dla klas o "podobnej" dziedzinie czyli np: class zwierzak class kot extends zwierzak lub class db class koszyk extends db (w tym przypadku koszyk to klasa opakowująca tablicę koszyk w bazie danych) lepiej, jeżeli klasa db korzysta z klasy config w celu pobrania potrzebnych jej informacji zatem ja opowiadam się za przykładem 2a - jest bardziej elegancki pozdrawiam |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 20:52 |