Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaczatki
Forum PHP.pl > Forum > PHP > Object-oriented programming
Lonas
Hej - takie pytanie mam poniewaz od niedawna zaczalem czytac o OOP, jednoczesnie o MVC i freameworku Zend.

Nie wiem na czym sie na poczatek skupic;

czy sprobowac napisac cos obiektowo z uzyciem szablonow np Smarty (rozwinac sobie znajomosc OOP),
czy skupiac sie juz na frameworku i w nim probowac cos tworzyc na podstawie MVC (zaznaczam jednak ze obiektowo dopiero zaczynam)

Zdr.
Sedziwoj
Smarty raczej do OOP nie można zaliczyć... (chyba że pominąć antywzorzec The Blob dry.gif )

Nie wiem na jakim jesteś etapie, bo jeśli wiesz jak się buduje obiekty, jak rozdziela się odpowiedzialność i sprawia aby się z sobą komunikowły (w podstawowej formie) to można szukać dobrych wzorców, właśnie pisząc np. w Symfony, aby nie wyrobić sobie złych nawyków.

EDIT
Co do Zend, to jak już nieraz było mówione ciężko jest zaliczyć to do FW, raczej do zbioru komponentów (choć pewnie w przyszłości stanie się w końcu FW)
Sabistik
Cytat
Co do Zend, to jak już nieraz było mówione ciężko jest zaliczyć to do FW, raczej do zbioru komponentów (choć pewnie w przyszłości stanie się w końcu FW)

Tak... Tylko że przykładu lepszego OOP ciężko by znaleźć.
mike
Cytat(Sabistik @ 28.04.2008, 14:07:19 ) *
Tak... Tylko że przykładu lepszego OOP ciężko by znaleźć.
Oj bo przeniosę tego posta na Humor.
Tyle zbędnych Singletonów, niejednolitego API i chorego wręcz uwielbienia do pakowania wszystkiego w metody magiczne nie widziałem.
Lonas
Co w takim razie na poczatek obiektowo sprobowac napisac ?
Ociu
System newsów ? smile.gif W tym sterownik MySQL, szablony itp. Toporne, ale dokształcające.
Strzałek
Cytat(Sabistik @ 28.04.2008, 14:07:19 ) *
Tak... Tylko że przykładu lepszego OOP ciężko by znaleźć.



Teraz to poleciałeś. Rozumiem twoje ulubienie do tego FW jednak, no cóż. Naprawdę nie jest ciężko znaleźć coś napisanego lepiej.
Sabistik
Cytat
Naprawdę nie jest ciężko znaleźć coś napisanego lepiej.

No to może przedstaw swoje znaleziska zamiast pisać puste posty. Chętnie się nauczę lepszego oop...
mike
Cytat(Sabistik @ 28.04.2008, 22:19:57 ) *
No to może przedstaw swoje znaleziska zamiast pisać puste posty. Chętnie się nauczę lepszego oop...
Na dzień dobry bo mam mało czasu.

Interfejs Request:
  1. <?php
  2. interface Zend_Request_Interface {
  3. public function __get($key);
  4.  
  5. public function __set($key, $value);
  6.  
  7. public function __isset($key);
  8.  
  9. public function get($key);
  10.  
  11. public function set($key, $value);
  12.  
  13. public function has($key);
  14.  
  15. public function getParam($key);
  16.  
  17. public function setParam($key, $value);
  18.  
  19. public function getParams();
  20.  
  21. public function setParams(array $params);
  22. }
  23. ?>

Co to ma wspólnego w czymkolwiek kojarzącym się z Request? Nic. Piszę to ponieważ połowa klas i interfejsów jest nafaszerowana jakimiś setParam(). Nie wpadli na żadnego ParameterHoldera? Złamanie w skali globalnej jednaj z podstawowych zasad - DRY.

Poza tym większość klas jest nafaszerowana takimi kwiatkami:
  1. <?php
  2.  
  3. class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract {
  4.  
  5. public function __get($key)
  6. {
  7. switch (true) {
  8. case isset($this->_params[$key]):
  9. return $this->_params[$key];
  10. case isset($_GET[$key]):
  11. return $_GET[$key];
  12. case isset($_POST[$key]):
  13. return $_POST[$key];
  14. case isset($_COOKIE[$key]):
  15. return $_COOKIE[$key];
  16. case ($key == 'REQUEST_URI'):
  17. return $this->getRequestUri();
  18. case ($key == 'PATH_INFO'):
  19. return $this->getPathInfo();
  20. case isset($_SERVER[$key]):
  21. return $_SERVER[$key];
  22. case isset($_ENV[$key]):
  23. return $_ENV[$key];
  24. default:
  25. return null;
  26. }
  27. }
  28.  
  29. public function get($key)
  30. {
  31. return $this->__get($key); // To jest szczególnie fajne! :-)
  32. }
  33.  
  34. public function set($key, $value)
  35. {
  36. return $this->__set($key, $value);
  37. }
  38.  
  39. public function __isset($key)
  40. {
  41. switch (true) {
  42. case isset($this->_params[$key]):
  43. return true;
  44. case isset($_GET[$key]):
  45. return true;
  46. case isset($_POST[$key]):
  47. return true;
  48. case isset($_COOKIE[$key]):
  49. return true;
  50. case isset($_SERVER[$key]):
  51. return true;
  52. case isset($_ENV[$key]):
  53. return true;
  54. default:
  55. return false;
  56. }
  57. }
  58.  
  59. public function has($key)
  60. {
  61. return $this->__isset($key);
  62. }
  63.  
  64. // ...
  65.  
  66. ?>

Efekt? Bez zaglądania w kod nie jesteś w stanie stwierdzić co dana klasa robi i do czego służą jej metody.
A dokumentacja jest nieaktualna i słabo napisana.

W ZF w stopniu przekraczającym dobry smak są nadużywane metody magiczne. Po 3 miesiącach pacy na tym frameworku wypracowałem powiedzenie. Jeśli chcesz coś pobrać to na pewno jest to ukryte w jakiejś magicznej metodzie. Tylko której?

To jest mój główny zarzut dotyczący ZF. Totalne pomieszanie i poplątanie i brak czytelności.
Lonas
smile.gif) dobra troszke mi zniesmaczyliscie ZF ..

w takim razie sprawdze symfony i moze sprobuje w tym frameworku zrobic jakas galerie czy system newsow smile.gif
mike
Cytat(Lonas @ 29.04.2008, 10:25:20 ) *
w takim razie sprawdze symfony i moze sprobuje w tym frameworku zrobic jakas galerie czy system newsow smile.gif
Tak naprawdę to zaczynanie z jakimkolwiek frameworkiem może być dla Ciebie trudne. Czy to będzie ZF, czy symfony czy cokolwiek innego.

Zwróć uwagę na to, że framework jest to przeważnie duża konstrukcja stworzona z zastosowaniem wielu wzorców, których możesz nie rozumieć i się w nich gubić. Napisanie systemu newsów za pomocą symfony to jak nauka parkowania tyłem TIRem z naczepą tylko po to by nauczyć się parkować po latach doświadczeń jazdy na rowerze.

Jeśli chcesz nauczyć się programować obiektowo zacznij od teorii, książek i artykułów. Dowiedz się czym są obiekty, klasy... Jak na siebie oddziaływają i kiedy są dobrze połączone i co to są wzorce. Nie musisz znać całej teorii OOP na pamięć. Po prostu dowiedz się w jakiej materii będziesz się poruszał.

Moim zdaniem powinieneś napisać ten przykładowy system newsów ale sam projektując klasę News, Post, User czy co tam chcesz. Nawet jeśli to wszystko umieścisz w strukturalnym kodzie a tylko część będzie spełniała jakieś tam paradygmaty OOP, nawet jeśli połowa będzie błędna to lepiej na tym wyjdziesz niż skorzystasz z frameworka. Jak Ci się to uda powtórz to samo na jednym, dwóch czy trzech różnych frameworkach.
Zobacz co one Ci dają, jaki ciężar z Ciebie zdejmują i co oferują.
Lonas
Rozumiem smile.gif dzieki za wskazowki, wlasnie w takim kierunku szedlem caly czas tylko czytajac coraz wiecej o OOP natrafialem na MVC, na frameworki i coraz tego wiecej bylo az w koncu nie wiedzialem za co sie zabrac smile.gif

W takim razie poprostu napisze sobie przykladwy system newsow z wykorzystaniem jakis szablonow zeby nie mieszac kodu strukturalnego z obiektowym.


Dzieki i pozdrawiam smile.gif
Cysiaczek
Coż, "napisanie" systemu news w Symfony sprowadza sie do odpalenia konsoli i wkejenia:

Cytat


Wracając do tematu :

Cytat
W takim razie poprostu napisze sobie przykladwy system newsow z wykorzystaniem jakis szablonow zeby nie mieszac kodu strukturalnego z obiektowym.


Szablony to nie jest gwarancja, ani nawet skuteczna metoda na odseparowanie kodu strukturalnego od obiektowego. Szablony (Smarty) w ogóle mają bardzo nikły sens,
Napisz ten system news używając php w warstwie prezentacji, bo to ona ma zostać odseparowana od wartswy logiki.

Pozdrawiam.
Sedziwoj
Cytat(Cysiaczek @ 30.04.2008, 04:27:12 ) *
Szablony (Smarty) w ogóle mają bardzo nikły sens,


Ciekawa opinia, to jakby powiedzieć że przycisk (nad tym okienkiem edycji) b jest nie potrzebny, bo przecież co za kłopot napisać [b] a potem jego zamknięcie.
Bo mi się wydaje, że to jedna z zalet stosowania szablonów, uproszczony interfejs.
Oczywiście mówię o przypadku kiedy to nie programista podpina wygląd, ale osoba która zna HTML+CSS a do szczęścia takiej znajomość PHP jest zbędna.
A czy przypadkiem w Symfony, warstwa prezentacji, to nie taki uproszczony system szablonów dry.gif

EDIT
Chyba trochę odchodzę od tematu rozmowy, ale mnie zaciekawiła ta opinia na temat szablonów.

P.S.
Gdyby nie było tej głupiej 30s przerwy między dodawaniem postów, to bym dodał kolejny, a nie edytował.
Lonas
Cytat(Cysiaczek @ 30.04.2008, 02:27:12 ) *
Napisz ten system news używając php w warstwie prezentacji, bo to ona ma zostać odseparowana od wartswy logiki.

Mozesz o tym cos wiecej napisac - wymyslilem sobie juz co bede pisal - poniewaz swojego czasu napisalem taki system do zarzadzania magazynem oraz zarzadzania sprzedaza (faktury) z tym ze calosc byla pisana strukturalnie z "pseudo" wydzieleniem widoku od kodu - tworzylem sobie katalog z formatkami i w nich tylko wczytywalem dane do formatek.

Dopisze sobie do tego nowa funkcjonalnasc - planowanie produkcji i tutaj pobawie sie obiektowo. Myslalem napisac sobie klasy oblsugujace dane funkcjonalnosci i do prezentacji wynikow uzyc Smarty.

Z czasem chcialbym stowrzyc taka aplikacje zgodnie z modelem MVC w jakims frameworku
cbagov
proponuje zaczac od zapoznania sie z PHP, moze byc 4, moze byc 5
zrobisz sobie obiekciki, szablony i inne cudenka
w kilka dni
Sedziwoj
Cytat(cbagov @ 30.04.2008, 14:21:50 ) *
proponuje zaczac od zapoznania sie z PHP, moze byc 4, moze byc 5


Tia bardzo dobra rada, zacząć od 4, gdy to już jest przeszłość, jakby zacząć od kart perforowanych
cbagov
wiem, ze dobra @Sedziwoj, nie opowiadaj ludziom bajek
Sedziwoj
Cytat(cbagov @ 30.04.2008, 18:07:14 ) *
wiem, ze dobra @Sedziwoj, nie opowiadaj ludziom bajek


To tylko powiem że z podpowiedzią pomyliłeś działy, bo w PHP4 nie ma obiektowości.
A jak uważasz, że opłaca się uczyć czegoś co umiera, to już Twoja sprawa, ale nie podpowiadaj takich głupot innym.
Cysiaczek
@cbagov - pisz do rzeczy, bo teraz nawet nie wiedomo o co Ci chodzi.
@sedziwoj - Powiedzmy inaczej - dla programisty maja nikły sens, bo grafikom,to może do gustu przypadną. W SF nie masz szablonów - masz gołe php wspierane helperami. Jedne są mniej, inne bardziej przydatne (np. wszelkie 'object_helpery'). Bardzo fajnie tez wygląda kodowanie JS w helperach (ale to znam słabo, wiec mogę się mylić).
@lonas - wystarczy, że zachowasz podział na 3 warstwy (MVC)
1. Dane - operacje na źródłach danych
2. Logika - obsługa poleceń - wykorzystanie danych
3. Prezentacja - wyświetlenie wyników - może być w zwykłym html przeplatanym php i nie jest to złe rozwiązanie.

Pozdrawiam.
cbagov
@Cysiaczek, zapomniales dodac poprawke do tej madrosci:

@Sedziwoj "bo w PHP4 nie ma obiektowości"

mysle, ze juz wiadomo o co chodzi
Sedziwoj
Cytat(Cysiaczek @ 30.04.2008, 21:58:26 ) *
@sedziwoj - Powiedzmy inaczej - dla programisty maja nikły sens, bo grafikom,to może do gustu przypadną. W SF nie masz szablonów - masz gołe php wspierane helperami. Jedne są mniej, inne bardziej przydatne (np. wszelkie 'object_helpery'). Bardzo fajnie tez wygląda kodowanie JS w helperach (ale to znam słabo, wiec mogę się mylić).


Wiesz ale jak chcesz dzielić pracę, to właśnie widok jest najlepszym miejscem aby tym się grafik zajął, programista daje tylko co mu potrzeba, lub wstawia gdzie trzeba (zależy kto pierwszy stworzy szablon).
Do tego nie wiem jaka jest definicja szablonu, ale moim zdaniem to co jest w SF też podchodzi.

Tak tylko podkreślę, w widoku dane powinny być tylko wyświetlane, nie powinno tam być żadnych obliczeń (najwyżej sprawdzenie wartości zmiennej, np. czy coś ma się wyświetlić, pętle jak trzeba jakiś zbiór danych wyświetlić, no i include innych plików widoku)

@cbagov
Jak Cię proszą abyś rozwinął wypowiedź, to byś to może łaskawie zrobił, nie każdy czyta w myślach, a na domysłach lepiej nie opierać odpowiedzi.

P.S. ale jeśli się nie mylę, to masz kiepskie pojęcie o obiektowości, jeśli myślisz że to coś co jest w PHP4 można tym nazwać.
Lonas
Nie bede zaczynal osobnego tematu.

Czy poprawnie zbudowalem sobie sterownik do bazy ?

  1. <?php
  2. class DB{
  3. protected $polacz;
  4. static protected $instancja = NULL;
  5.  
  6. public function __construct(){
  7. $haslo = array('host' => 'localhost', 'uzytkownik' => 'root', 'haslo' => '123', 'baza' => 'test');
  8. $this -> polacz = mysql_connect($haslo['host'],$haslo['uzytkownik'],$haslo['haslo']);
  9.  
  10. if(!$this -> polacz)
  11. exit('Nie mozna polaczyc z serwerem bazy danych');
  12. elseif(!mysql_select_db($haslo['baza'],$this -> polacz))
  13. exit('Nie mozna wybrac bazy');
  14. }
  15.  
  16. public function __destruct(){
  17. mysql_close($this -> polacz); 
  18. }
  19.  
  20. static function PowolajInstancje(){
  21. if(self::$instancja === NULL)
  22. return self::$instancja = new DB;
  23. }
  24.  
  25. public function WykonajZapytanie($zapytanie){
  26. if(!$zapytanie = mysql_query($zapytanie, $this -> polacz))
  27. else
  28. return $zapytanie;
  29. }
  30.  
  31. public function PobierzWiersz($zapytanie){
  32. return mysql_fetch_array($zapytanie);
  33. }
  34.  
  35. public function PobierzWszystko($zapytanie){
  36. $zapytanie = $this -> WykonajZapytanie($zapytanie);
  37. $dane = array();
  38.  
  39. while($linia = $this -> PobierzWiersz($zapytanie))
  40. $dane[] = $linia;
  41.  
  42. return $dane;
  43. }
  44.  
  45. public function PobierzRekord($zapytanie){
  46. if($this -> IleRekordow($zapytanie) > 1)
  47. die('Zapytanie daje w wyniku wiecej niz 1 rekord. Uzyj metody PobierzWszystko');
  48. else{
  49. $zapytanie = $this -> WykonajZapytanie($zapytanie);
  50. return $zapytanie = $this -> PobierzWiersz($zapytanie);
  51. }
  52. }
  53.  
  54. public function IleRekordow($zapytanie){
  55. $zapytanie = $this -> WykonajZapytanie($zapytanie);
  56. return mysql_num_rows($zapytanie);
  57. }
  58.  
  59.  
  60. }
  61. //przyklady uzycia
  62.  
  63. $db = DB::PowolajInstancje();
  64. //tutaj pytanie czym sie rozni odwolanie do metody statycznej zeby wywolac obiekt 
    od takiego wywolania $db = new DB;
  65.  
  66. //zwraca ilosc wierszy
  67. print $wynik = $db -> IleRekordow('SELECT * FROM towar WHERE id_towar = 1 ');
  68.  
  69. //zwraca jeden rekord
  70. $wynik = $db -> PobierzRekord('SELECT * FROM towar WHERE id_towar = 1');
  71. echo $dane['nazwa_towar_pl'];
  72.  
  73.  
  74. //zwraca wiele rekorow
  75. $wynik = $db -> PobierzRekord('SELECT * FROM towar WHERE id_towar > 5 AND id_towar < 20');
  76.  
  77. foreach($wynik AS $dane)
  78. echo $dane['nazwa_towar_pl']."<br>";
  79.  
  80.  
  81.  
  82.  
  83.  
  84. ?>
cbagov
@Sedziwoj - pewnie gdybys programowal w JAVA stwierdzilbys, ze w PHP 5 nie ma obiektowosci

ponownie zamulasz dyskusje odnoszac sie prymitywnie do nieznanego tobie stanu mojej wiedzy
skup sie na temacie a nie trollujesz
zorientuj sie czym jest programowanie obiektowe, potem komentuj

PS. widze, ze nie czytasz w myslach, manualach pewnie tez stad niewiedza o obiektowosci w PHP4 JAKA BY ONA NIE BYLA
revyag
@cbagov, jeśli myślisz obiektowo i umiesz dobrze zaplanować aplikację to język który wybierzesz jest tylko narzędziem, a php4 jest narzędziem kiepskim, wiele rzeczy trzeba obchodzić na około robiąc w trakcie parę dodatkowych zakrętów, zamiast iść prosto. php5 tą sytuację znacząco poprawia stając się narzędziem lepszym, więc sens uczenia się programowania obiektowego używając ku temu php4 jest co najmniej wątpliwy.
mike
Cytat(cbagov @ 7.05.2008, 10:02:42 ) *
@Sedziwoj - pewnie gdybys programowal w JAVA stwierdzilbys, ze w PHP 5 nie ma obiektowosci
Wyobraź sobie że ja pisze w Java już od dłuższego czasu. Również komercyjnie i nie podzielam Twojego zdania. PHP nie jest kopią Javy ale mówienie, że nie posiada obiektowości to przesada. Trzymając się paradygmatów OOP i stosując możliwości języka PHP5 można pisać bardzo przyjemnie i całkowicie w OOP.
Zarzucasz ~Sedziwojowi trollowanie ale z Twoich wypowiedzi nie wynika za wiele i to określenie pasuje raczej do Ciebie niż do niego.

Rady o nauce PHP4 nawet komentować się nie chce, bo ciężko pisać próbując powstrzymać śmiech. Równie dobrze mógłbyś zasugerować komuś kto chce nauczyć się generyków żeby zaczął od Java 1.3 lub starszej.
Sedziwoj
Cytat(Lonas @ 7.05.2008, 09:35:55 ) *
Czy poprawnie zbudowalem sobie sterownik do bazy ?


Moim zdaniem, nie.
Ponieważ zobacz, że w przykładzie użycia który podałeś do bazy jest wysyłanych 3 kwerendy, do tego jak dobrze widzę to wyrzuci Ci błąd, bo PobierzRekord() służy do jednego, a użyłeś do wielu.
Chciałeś pogodzić dwie rzeczy w jednym miejscu, sam sterownik powinien mieć podstawowe funkcje, zwracać nie obrobione dane, czyli zasoby. A pamiętaniem tych zwróconych zasobów, działaniem na nich przy pomocy sterownika powinna zajmować się inna np. klasa.
Lonas
To znaczy przy tym uzyciu tutaj sie pomylilem - ale nie do konca wywali blad tylko wyswietli komunikat ze zapytanie zwraca wiecej niz jeden wiersz i ze nalezy uzyc innej metody smile.gif


  1. <?php
  2. $db = DB::PowolajInstancje();
  3.  
  4.  
  5. //zwraca ilosc wierszy
  6. print $wynik = $db -> IleRekordow('SELECT * FROM towar WHERE id_towar = 1 ');
  7.  
  8. //zwraca jeden rekord
  9. $wynik = $db -> PobierzRekord('SELECT * FROM towar WHERE id_towar = 1');
  10. echo $dane['nazwa_towar_pl'];
  11.  
  12.  
  13. //zwraca wiele rekorow
  14. $wynik = $db -> PobierzRekord('SELECT * FROM towar WHERE id_towar > 5 AND id_towar < 20');
  15. // tu wyswietli komunikat ze nalezy uzyc metody PobierzWszystko
  16.  
  17. $wynik = $db -> PobierzWszystko('SELECT * FROM towar WHERE id_towar > 5 AND id_towar < 20');
  18. //tak powinno dzialac :)
  19. foreach($wynik AS $dane)
  20. echo $dane['nazwa_towar_pl']."<br>";
  21. ?>


Dodalem sobie jeszcze metode do wyciagania struktury tabeli
  1. <?php
  2. public function PokazStrukture($tabela){
  3. return $zapytanie = $this -> PobierzWszystko('SHOW FIELDS FROM '.$tabela.' ');
  4. }
  5.  
  6. //uzycie
  7.  
  8. $wynik = $db -> PokazStrukture('kontrahent');
  9.  
  10. foreach($wynik AS $dane)
  11. echo $dane[1]."<br>";
  12. ?>
cbagov
Wyjasnijmy jedno, nie ja chwale php4 przed php5 tylko mister Sedziwoj tak sobie wymyslil gdyz ma problem z czytaniem i interpretacja, choc sam uparcie namawia by czytac ze zrozumieniem.


@revyag -
jak najbardziej, to wlasnie moja mysl, poza tym, ze mylisz sie co do php4, wiekszosc tutejszych problemow nie ociera sie nawet o potege OOP jak i nie ociera sie o problemy zwiazane z niemozliwoscia ich rozwiazania w php4.


@mike ... papugujesz Sedziwoja w braku zrozumienia czytanych tresci ?

"mówienie, że (php5) nie posiada obiektowości to przesada."

A kto to powiedzial, ja ?winksmiley.jpg
TO IRONIA wobec podejscia Sedziwoja do porownania php4 - php5, a ty budujesz na tym niezrozumieniu mojej wypowiedzi wypowiedz swoja hehe.

A i @mike..., chyba slabo znasz J i PHP bo porownanie 1.6 do 1.3 jest KURIOZALNE biggrin.gif

A co do programowania w php4 ... na tym forum 3/4 postow nie obejmuje nawet 1/3 mozliwosci php4, wiec nie schlebiaj sobie ze skoro moze cos tam klikasz w php5 to jestes góró.

80% php5 to php4 i to sa fakty.

Moj post php4/5 wlasnie mial to pokazac, ze PRZEDE WSZYSTKIM SPOSOB, a pozniej NARZEDZIE (lub jego dobor do obranego sposobu).

Najsmieszniejszy jest fakt, ze ja wcale nie wynosze php4 nad php5 winksmiley.jpg ale skoro tak uwazacie






@Lonas

nie ma sensu tworzyc nowej metody dla kazdego zapytania
trzeba jak najbardziej upraszczac

$db -> IleRekordow
$db -> PobierzWszystko
$db -> itp

zrob sobie jedna metode

$db-> Query ($_sql)

gdzie $_sql = zapytanie, bo zapytanie wystarczajaco roznicuje dzialanie

eliminuje to tez metode $db -> IleRekordow ($_sql) - bo mozesz uzyc $db-> Query ($_sql) i skorzystac z wewnetrznej zmiennej przechowujacej

PokazStrukture() tez jest niepotrzebna, skoro samo zapytanie definiuje ci juz wlasna role "SHOW FIELDS FROM"
Sedziwoj
@Lonas

Po pierwsze, nie zwróciłeś uwagi na najważniejsze moje uwagi.
Po drugie, die() to nie komunikat, tylko koniec działania skryptu, więc nie ma różnicy z błędem, bo i tak nie wykona się dalej, komunikat wyświetla się, ale pozwala dalej wykonać się skryptowi.

@cbagov
Cała sprawa jest w tym, że Twoim zdaniem to coś co jest w PHP4 nazywasz obiektowością, gdy niema tam jednej z podstawowych rzeczy, hermetyzacji. Dlatego nie powinno się wymieniać PHP4 jako przydatnego do nauki programowania obiektowego. Co do jakości kodów i problemów, to zwróć uwagę, że większość jest przez początkujących, nie wiem czy to co pisał Splatch zdołał byś nazwał czymś prostym.
Co do Twojego pojęcia ironii, to raczej było napisane jako wyolbrzymienie, ironią bym tego nie nazwał.

EDIT zjadłem literkę
mike
Cytat(cbagov @ 30.04.2008, 14:21:50 ) *
proponuje zaczac od zapoznania sie z PHP, moze byc 4, moze byc 5
Nie wiem co miałeś na myśli bo składasz mało rozbudowane zdania. Nie wiem czy masz tak mało do powiedzenie czy nie potrafisz sie wysłowić.
Wypowiedź tą można odczytać jednoznacznie, że wg. Ciebie nie gra roli czy programowania obiektowego będziesz się uczył na podstawie PHP4 czy na podstawie PHP5. Otóż wyobraź sobie, że różnica jest duża. I to od tego właśnie zaczęła się dyskusja, bo to co polecasz to błąd.

Cytat(cbagov @ 7.05.2008, 11:00:38 ) *
A i @mike..., chyba slabo znasz J i PHP bo porownanie 1.6 do 1.3 jest KURIOZALNE biggrin.gif
Równie kuriozalne jest porównywanie PHP4 do PHP5, są to dwa różne narzędzia. Kilka zmian dotyczących OOP to tylko kropla w morzu zmian. Porównując 1.3 do 1.6 chciałem Ci uświadomić, że taka samą przepaścią oddalone jest PHP4 od PHP5.

Cytat(cbagov @ 7.05.2008, 11:00:38 ) *
A co do programowania w php4 ... na tym forum 3/4 postow nie obejmuje nawet 1/3 mozliwosci php4, wiec nie schlebiaj sobie ze skoro moze cos tam klikasz w php5 to jestes góró.
A jakie ma znaczenie co jest pisane na forum? Żadne. Może trzymaj się dyskusji a nie latasz po tematach.
Nie wiem na ile Ty znasz dwa wspomniane języki i Ty nie wiesz na ile ja je znam. Oceniam tylko to co twierdzisz na łamach tego wątku. A to co piszesz to chore głupoty.
Przykro też słuchać że ktoś kto się tak wymądrza utożsamia programowanie z klikaniem. Pochwal się może jakiego WYSIWYGa używasz tongue.gif


I na tym kończmy dyskusję na temat wyższości Świąt Bożego Narodzenia nad Świętami Wielkiej Nocy. Wracamy do zagadnienia, które drąży ~Lonas kolejne posty nie na temat będę usuwane po uprzednim wręczeniu ostrzeżenia. Bez wyjątku.
Lonas
Czyli w takim sterowniku dodac jedna metode zapytanie ? - i wszystko co sie pojawi musi byc definionwane przez zapytanie mysql ?

Wzorowalem sie na sterowniku sterownikach ktore znalazlem gdzies w internecie- w wiekszosci byly one troszke bardziej rozbudowane niz ograniczenie sie do jednej metody query :/
Sedziwoj
@Lonas
W internecie jest wiele rozwiązań, a aby coś napisanego w PHP znaleźć dobrze napisanego to problem.

Ogólnie sterownik sam w sobie niewiele robi, tworzy tylko taką otoczkę nad tym co oferuje PHP, tylko skleja to w całość, to takie PDO.
Te dodatkowe rzeczy, które chcesz umieścić nie umieszczaj w sterowniku, tylko coś co z niego korzysta. To podstawa w obiektowości, aby obiekty robiły tylko ściśle określony, mały i spójny zakres obowiązków.
Taki sterownik powinien mieć na pewno łączenie z bazą, wysyłanie kwerendy (ze zwróceniem wyników), można dorzucić zliczanie ile jest wyników w czymś co zwróciła metoda wywołująca kwerendę ("zasoby"), dodanie znaków ucieczki do specyficznych rzeczy, wybranie z zasobów wiersza (tu albo osobne metody w jakiej formie, lub z parametrem i domyślnie np. array num), zwolnienie zasobów.
Czy coś w tym stylu, to co to wykorzysta, to już inna sprawa. Tam możesz dodać coś więcej, tworzyć specyficzne kwerendy, coś co buduje kwerendy na podstawie jakiegoś szablonu itp. itd.
Pamiętaj aby klasa miała ściśle określony zakres obowiązków, jak chcesz coś dodać co nie pasuje, to znaczy często że musisz utworzyć inną klasę.
Lonas
To w takim razie poprawne bedzie napisanie klasy do laczenia z baza i wykonywania kwerend (sterownik) oraz stworzenie drugiej klasy, ktora ma rozne metody wyswietlania wynikow w zaleznosci od wyniku zapytania ktory zostanie jej przekazany ?
dr_bonzo
@cbagov:
Cytat
@Lonas

nie ma sensu tworzyc nowej metody dla kazdego zapytania
trzeba jak najbardziej upraszczac

$db -> IleRekordow
$db -> PobierzWszystko
$db -> itp

zrob sobie jedna metode

$db-> Query ($_sql)

gdzie $_sql = zapytanie, bo zapytanie wystarczajaco roznicuje dzialanie

eliminuje to tez metode $db -> IleRekordow ($_sql) - bo mozesz uzyc $db-> Query ($_sql) i skorzystac z wewnetrznej zmiennej przechowujacej

PokazStrukture() tez jest niepotrzebna, skoro samo zapytanie definiuje ci juz wlasna role "SHOW FIELDS FROM"



A ja uwazam ze odwrotnie, te metody powinny byc, bo po co 100 razy pisac ->query( "SHOW FIELDS FROM" ) ; jak mozna skorzystac z podpowiadania przy ->pokaz[TAB]/[ctrl+spacja]

Z tym ze @Lonas masz je zle napisane, wywolujesz niepotrzebnie te same zapytania wielokrotnie. Rozdziel ta klase na dwie: polaczenie z baza + wynik zapytania, z ktorego to bedziesz pobieral ilosc rekordow:

  1. <?php
  2. public function PobierzRekord($zapytanie){
  3. if($this -> IleRekordow($zapytanie) > 1)
  4. die('Zapytanie daje w wyniku wiecej niz 1 rekord. Uzyj metody PobierzWszystko');
  5. else{
  6. $zapytanie = $this -> WykonajZapytanie($zapytanie);
  7. return $zapytanie = $this -> PobierzWiersz($zapytanie);
  8. }
  9. }
  10. ?>


1. ile rekordow a potem wykonaj zapytanie - robia to samo 2 razy, po co
2. mieszasz przeznaczenie zmiennych: $zapytanie jest SQLka, resultsetem, wierszem z bazy, exclamation.gif! ZLOO
cbagov
@Lonas

dobrze napisana metoda ->Query czy jak tam ja sobie nazwiesz, zapewni ci jednoczesnie obsluge bledow, obsluge polaczenia z baza, przechowa wyniki zapytania oraz potrzebne ci zmienne pomocnicze typu ilosc rekordow itp.
Wszystko w jednym miejscu, co nie znaczy, ze "sterownik", czyli twoj obiekt nie moze miec innych metod.

Chodzi o to by komunikowac sie z nim latwo i szybko. Wewnatrz mozesz miec potrzebne ci metody dodatkowe, sama ->Query przeciez ich wlasnie bedzie uzywac. Jak swpomnialem wczesniej - obsluga polaczenia itp, wszystko w metodach ale po co myslec o 20 metodach w obiekcie kiedy mozesz miec ich tylko kilka.

W miare rozbudowy sam stwierdzisz, ze ->Query nie rozwiazuje czegos tak jak bys chcial - stale majac jednak na uwadze szybkosc i prostote, wtedy rozbudujesz sterownik. Twoim dazeniem powinna byc jednak maksymalna unifikacja i sprowadzanie TWOICH wywolan do jak najmniejszej ilosci metod - ale zbudowanych z kolejnych metod, bo nie nalezy pisac procedur pojedynczych nadmiernie uniwersalnych (ponowne wykorzystanie kodu, czytelnosc itp)

"To w takim razie poprawne bedzie napisanie klasy do laczenia z baza i wykonywania kwerend (sterownik) oraz stworzenie drugiej klasy,"

Owszem bo sterownik nie musi wiedziec za wiele, mozesz zbudowac klase, ktora wydaje polecenia wlasnie sterownikowi i TO ONa przechowuje juz wczesniej wydobyte dane typu ( "SHOW FIELDS FROM" )

@dr_bonzo

napisalem "i skorzystac z wewnetrznej zmiennej przechowujacej", np. powtarzajace sie czeste wywolania podobnej kwerendy SQL (co jak wiadomo 'nalezy maksymalnie minimalizowac';) )

---
Połowę posta kasuję bo nie jest na temat. Wyżej o coś prosiłem, ale widać nie potrafisz się tej prośby uszanować.
Dostajesz ostrzeżenie a Twoje posty zanim się ukarzą będą wymagały akceptacji moderatora. Taki stan rzeczy będzie trwał przez 3 dni.
~mike
Lonas
Tak poprawilem klase nie rozbijajac jej jeszcze na 2 klasy

  1. <?php
  2. class DB{
  3. protected $polacz;
  4. static protected $instancja = NULL;
  5.  
  6. public function __construct(){
  7. $haslo = array('host' => 'localhost', 'uzytkownik' => 'root', 'haslo' => '123', 'baza' => 'test');
  8. $this -> polacz = mysql_connect($haslo['host'],$haslo['uzytkownik'],$haslo['haslo']);
  9.  
  10. if(!$this -> polacz)
  11. exit('Nie mozna polaczyc z serwerem bazy danych');
  12. elseif(!mysql_select_db($haslo['baza'],$this -> polacz))
  13. exit('Nie mozna wybrac bazy');
  14. }
  15.  
  16. public function __destruct(){
  17. mysql_close($this -> polacz); 
  18. }
  19.  
  20. static function PowolajInstancje(){
  21. if(self::$instancja === NULL)
  22. return self::$instancja = new DB;
  23. }
  24.  
  25. public function WykonajZapytanie($zapytanie){
  26. if(!$wynik_zapytania = mysql_query($zapytanie, $this -> polacz))
  27. else
  28. return $wynik_zapytania;
  29. }
  30.  
  31. public function PobierzWiersz($wynik_zapytania){
  32. return mysql_fetch_array($wynik_zapytania);
  33. }
  34.  
  35. public function PobierzWszystko($zapytanie){
  36. $wynik_zapytania = $this -> WykonajZapytanie($zapytanie);
  37. $dane = array();
  38.  
  39. while($linia = $this -> PobierzWiersz($wynik_zapytania))
  40. $dane[] = $linia;
  41.  
  42. return $dane;
  43. }
  44.  
  45. public function PobierzRekord($zapytanie){
  46. $wynik_zapytania = $this -> WykonajZapytanie($zapytanie);
  47.  
  48. if(mysql_num_rows($wynik_zapytania) > 1)
  49. die('Zapytanie daje w wyniku wiecej niz 1 rekord. Uzyj metody PobierzWszystko');
  50. else
  51. return $this -> PobierzWiersz($wynik_zapytania);
  52.  }
  53.  
  54. public function IleRekordow($zapytanie){
  55. return mysql_num_rows($this -> WykonajZapytanie($zapytanie));
  56. }
  57.  
  58. public function PokazStrukture($tabela){
  59. return $zapytanie = $this -> PobierzWszystko('SHOW FIELDS FROM '.$tabela.' ');
  60.  
  61. }
  62. }
  63. ?>


Majac teraz taki problem.

Zakladam, ze produkuje jakies urzadzenie, ktore sklada sie z 10 czesci.

Mam klase DB.class.php odpowiedzialna za obsluge bazy. Potrzebuje jeszcze klasy do obslugi sesji.

Nastepna klase jaka chce napisac to maszyna.class.php

W tej klasie powinny byc metody(poprawcie mnie) :

- WprowadzSpisCzesci - ustalamy jakie i ile czesci potrzeba do zrobienia tej maszyny
- EdytujSpisCzesci -edycja spiewnika czesci
- UsunMaszyne - usuniecie maszyny
- PokazMozliwaProdukcje - pokazanie ile maszyn mozna stworzyc z akualnego stanu

Czy taki tok myslenia jest ok ?
cbagov
@mike nie cwaniakuj, zostawiasz swoje watpliwie uprzejme i sensowne posty a moje usuwasz,
skoro nie wypowiedziales sie w temacie watku to skasuj i swoje wypociny

@Lonas

Jesli chodzi o wzorzec singleton,
w przypadku php i mysql nie ma wiekszego znaczenia bo php i tak zajmuje sie laczem do sql i bedzie wiecej niz 1 tylko wtedy jesli podasz dodatkowe parametry. Takze tu niespecjalnie potrzebne to Instance.

Parametry bazy wartoby wyrzucic na zewnatrz i pobierac np jako parameter a nie na stale w obiekcie.

Jak juz tak bardzo chcesz miec tyle funkcji typu function IleRekordow($zapytanie)
co jest srednio potrzebne bo po pierwsze szkoda wysylac tylko po to zapytanie a po drugie wczesniejsze funkcje pobierajace tez generuja odpowiedz (np ile rekordow) a widze, ze nie zapamietujesz tych danych.
Tu moze ci sie przydac obiekt odpowiedzialny za faktyczne reprezentowanie BAZY a nie sterownika.
Otrzymujesz kilka wartosci, ktore zwracasz przez return i pozniej musisz recznie gdzies zapisac - no chyba, ze masz juz ten drugi obiekt w planie (warstwe bazy)
Ale mozesz miec jedno i drugie zintegrowane przez np rozszerzenie obiektu (extends) i nie przesylasz przez return tablic a zapamietujesz w $this->, ktore pozwalaja pozniej klasie nadal pracowac na samej sobie.

W function WykonajZapytanie($zapytanie) mozesz dodac 1 if, ktory sprawdzi ci dostepnosc polaczenia i w razie czego je zrealizuje.
Lonas
Ale w przypadku extends - wszystkie klasy ktore korzystaja z DB musialby byc jej pochodnymi ?

Wlasnie pytalem jaka jest roznica miedzy instancja a powolaniem nowego obiektu DB i faktycznie raczej ta metoda PowolajInstancje jest mi nie potrzebna
cbagov
Wcale nie mowilem, ze to DB musi byc klasa podstawowa, ale -moze-.
W zaleznosci od koncepcji mozesz rozszerzyc sterownik, klase DB albo stworzyc 3 obiekt - wspolny rodzic.

U mnie na razie odbywa sie to przez rozszerzenie interfejsu sterownika. Ale kazdy ma inne preferencje i sposob kodowania, nawyki.
Nie wchodz w dziedziczenie w projekcie za wczesnie chyba, ze rozrysujesz go na sucho i uwzglednisz komplet zaleznosci.
Fakt, ze kierownica jest w samochodzie nie oznacza, ze musi dziedziczyc z klasy pojazd winksmiley.jpg To prosty przyklad ale problemy mniej oczywiste czasem wpedzaja w dziwne zaleznosci miedzy obiektami.


A termin "klasy korzystajace z DB" - dzieli sie na dwa rodzaje, pracujace na wzajenie posiadanych danych w ramach hierarchii dziedziczenia, lub na danych udostepnianych.
Nadmierne zamykanie klasy nie jest wskazane.

Nie musisz uzywac extends - ale wtedy powinienes zapewnic spojny system wymiany danych miedzy klasami albo zaprojektowac interface i nalozyc na obie klasy. Osobiscie wole jednak implementowac Interface dla klas robiacych podobne rzeczy ale na roznych danych niz dla ubierac klasy robiace rozne rzeczy w jeden Interface.
Ale ZAWSZE wszystko zalezy od tematu, podejscia, czasu, potrzeb, efektu koncowego, cala reszta to ogolne wzorce.


To powolanie Instance ma miec na celu zachowanie "jednego i tylko jednego" egzemplarza obiektu tego rodzaju. Ma to sens w sytuacji, kiedy dane obiektu moga byc wielokrotnie inicjowane a tego nie chcemy. Np. aby bylo 1 polaczenie z baza, albo jakis tam konfig.

Jesli chodzi o SQL w php juz pisalem, php sie tym zajmuje, a przyklad z konfigiem i w ogole singleton przyda sie jak bedziesz albo pracowal w zespole, udzielal swojego kodu jako modul albo jesli nie mozesz sie polapac w tym co produkujesz i musisz zamykac swoje dziela w klatkach by ci nie broily winksmiley.jpg (taki zart)
Ociu
Panowie cbagov i mike, jeżeli nie skończycie swoich przepychanek, to zamknę temat i zaszkodzicie osobie trzeciej. Jeśli chcecie sobie pogadać to odsyłam na PW.
Lonas
@cbagov dzieki za odpowiedz.

Zaczalem teraz pisac klase do czegosc takiego - mam sobie maszyne, ktora sklada sie z roznych czesci. Tworze klase do wprowadzania maszyn do systemu oraz do wpisywania z czego sie skladaja.

Czy to powinny byc 2 klasy ?
klasa maszyna oraz klasa maszyna czesci ?

Pytanie czy w konstruktorze klasy moge automatycznie wywolywac polaczenie z baza ? czy powinno sie to robic w inny sposob ?
Jak teraz powiniem ustalac zmienne czy do metod klasy wsadzac potrzebne zmienne czy deklarowac wszystkie zmienne w klasie glownej ?

Chodzi mi np o nazwe maszyny, czas produkcji, czesci ktore wchodza w jej sklad


Wstepnie :

  1. <?php
  2. class maszyna{
  3.  
  4.  
  5. public function __construct(){
  6. $db = DB::PowolajInstancje();
  7. }
  8.  
  9. public function DodajMaszyne(){
  10.  
  11. }
  12.  
  13. public function UsunMaszyne(){
  14.  
  15. }
  16.  
  17. public function DodajSpis($id_maszyny){
  18.  
  19. }
  20.  
  21. public function EdytujSpis($id_maszyny){
  22.  
  23. }
  24.  
  25. public function UsunSpis($id_maszyny){
  26.  
  27. }
  28.  
  29. public function PokazSpis($id_maszyny){
  30.  
  31. }
  32. }
  33. ?>
cbagov
Cytat
Czy to powinny byc 2 klasy ?
klasa maszyna oraz klasa maszyna czesci ?


Zalezy od komplikacji maszyny, jesli mocno skomplkowane najlepiej sobie rozrysowac na kartce albo w jakims programie do tego celu bo latwiej ogarnac.
Wtedy tak jak mowisz. Dalej w zaleznosci od komplikacji czesci i ich ZROZNICOWANIA tworzysz nowe klasy.
NIE MA CO PRZESADZAC, kartka prawde ci powie winksmiley.jpg
Bo niestety jesli to prawdziwa maszyna to bedzie trzeba ja odwzorowac, co jednak pozwoli latwiej zapanowac nad sytuacja.
Gdzies mialem podobny przyklad ale ciagle nie moge go znalezc, jak mi sie przypomni to dam znac.


Cytat
Pytanie czy w konstruktorze klasy moge automatycznie wywolywac polaczenie z baza ? czy powinno sie to robic w inny sposob ?

W konstruktorze klasy odpowiedzialnej za polaczenie ? mozesz ale nie musisz, mozesz w metodzie, ktora na przyklad odpali sie przy pierwszym uzyciu komendy SQL i nawet nie bedziesz wiedzial kiedy sie nawiaze polaczenie.
Ogolnie nie ma spec. znaczenia, chyba, ze sa jakies uwarunkowania.


Cytat
Jak teraz powiniem ustalac zmienne czy do metod klasy wsadzac potrzebne zmienne czy deklarowac wszystkie zmienne w klasie glownej ?
Chodzi mi np o nazwe maszyny, czas produkcji, czesci ktore wchodza w jej sklad


Skladowe obiektu definiujesz w obiekcie, a to czy zrobisz to na sztywno czy dynamicznie nie ma znaczenia.
Takze zalezy od uwarunkowan, niektore obiekty w koncu moga miec skladowe nieznane do pewnego momentu itp.
Lonas
Moja klasa wyglada narazie tak :


  1. <?php
  2. class maszyna{
  3. public $id_maszyny;
  4. public $nazwa_maszyny;
  5. public $czas_produkcji;
  6. public $przynaleznosc_do;
  7.  
  8.  
  9. public function PobierzId($id_maszyny){
  10. $db = new DB;
  11. $sql = "SELECT * FROM maszyna WHERE id_maszyny = '".$id_maszyny."'";
  12. return $db -> PobierzRekord($sql);
  13. }
  14.  
  15. public function PobierzNazwa($nazwa_maszyny){
  16. $db = new DB;
  17. $sql = "SELECT * FROM maszyna WHERE nazwa_maszyny = '".$nazwa_maszyny."'";
  18. return $db -> PobierzRekord($sql);
  19. }
  20.  
  21. public function Zapisz(){
  22. $db = new DB;
  23. $sql = "INSERT INTO maszyna(nazwa,czas_produkcji,przynaleznosc_do) VALUES('".$this -> nazwa_maszyny."', '".$this -> czas_produkcji."', '".$this -> przynaleznosc_do."')";
  24. if($db -> WykonajZapytanie($sql))
  25.  return 1;
  26. }
  27. }
  28. ?>


Uzycie tak :

  1. <?php
  2. require_once('biblioteki/smarty/Smarty.class.php');
  3. require_once('biblioteki/mysql.class.php');
  4. require_once('biblioteki/maszyna.class.php');
  5.  
  6.  
  7. /*
  8. $smarty = new Smarty;
  9. $smarty->compile_check = true;
  10. $smarty->assign("test", "Tekst testowy ktory ma sie tu pojawic");
  11. $smarty->display('index1.tpl');
  12. */
  13.  
  14. $nowy = new maszyna;
  15.  
  16. $nowy -> nazwa_maszyny = 'druga';
  17. $nowy -> czas_produkcji = '21';
  18. $nowy -> przynaleznosc_do = '1';
  19.  
  20. if($nowy -> Zapisz())
  21. echo'ok';
  22.  
  23.  
  24. $test = $nowy -> PobierzParametry(1);
  25.  
  26. echo $test['nazwa']."<br>";
  27. ?>


Mam pytanie jak tutaj powinno wygladac uzycie klasy do wprowadzania edycji i usuwania maszyn z bazy ? Czy tak jak napisalem powyzej czy inaczej powinienm to skonstruowac ?

Drugie pytanie jak napisac metode PobierzParametry gdzie w parametrach funkcji moge podac wedlug ktorego pola parametry chce zobaczyc ?

Czyli np PobierzParametry(id = 5) badz PobierzParametry(nazwa = Czerwona maszyna) itd ?

Czy raczej do napisac osobne metody PobierzPoId, PobierzPoNazwie .. itd ?
ayeo
Witam!
Myślę, że konstruktor powinien pobierać wszystkie dane za jednym zamachem. Metody dostępowe powinny zwracać wartości z prywatnych własności (przypisanych przez konstruktor). Nie ma sensu pytać bazy 10 razy o to samo. Usuwać z bazy możesz przez dodanie metody delete(); lub z jakiegoś osobnego obiektu (Manager). Warto dodać jakąś flagę wewnątrz obiektu informującą o tym czy maszyna jest w bazie czy nie. Będzie to przydatne również przy zapisie (INSERT czy UPDATE).
Parametry trzymaj albo w tabeli, albo w OSOBNYCH właściwościach. Powinieneś je raczej pobierać (i ustawiać) osobno, a nie metodą z jakimiś parametrami. Parametry takie są mało intuicyjne, a przez to interfejs również. W sensie dobrze kombinujesz.

Pozdrawaiam!

PS Zrób osobną klasę dla bazy smile.gif
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.