Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Klasa a działania
Forum PHP.pl > Forum > Przedszkole
Fred1485
Wiam,

Czy pisząc klasę bardziej zaawansowaną, złożona z konstruktorów, funkcji w dużej ilości (nie jakieś 5 linijek kodu), powinienem w funkcjach ograniczyć się tylko do zwracania określonych wartości, pomijając np echo (przeglądałem sporo róznych kodów zaawansowanych i tam programiści zwracają jedynie jakieś wartości, wgl nie używają w klasach "pisania" tekstu metodą echo
b4rt3kk
Cytat(Fred1485 @ 31.03.2015, 17:53:54 ) *
Wiam,

Czy pisząc klasę bardziej zaawansowaną, złożona z konstruktorów, funkcji w dużej ilości (nie jakieś 5 linijek kodu), powinienem w funkcjach ograniczyć się tylko do zwracania określonych wartości, pomijając np echo (przeglądałem sporo róznych kodów zaawansowanych i tam programiści zwracają jedynie jakieś wartości, wgl nie używają w klasach "pisania" tekstu metodą echo


To już zależy od tego, do czego dana klasa ma służyć, ale dla własnej wygody, lepiej jak metoda zwróci string, który następnie wyświetlisz. Np.

  1. class View {
  2. public function body() {
  3. return '<div>body</div>';
  4. }
  5. }
  6.  
  7. echo View::body();
com
Raczej powinno sie unikac echo bo tak ograniczasz swoja klase. Klasy w duzej mierze poto sa aby ulatwiac Tobie prace. A budowanie czegos na echo sprawia ze w 95% staje sie ta klasa bezuzyteczna bo rownie dobrze wtedy moglbys jej wgl nie tworzyc. Dopiero zwracanie danych daje Ci mozlowosc operacji na nich. Wiec echo jak najmniej smile.gif
Fred1485
Tak właśnie myślałem i sie sprawa komplikuje bo już takie łatwe nie będzie: echo i po sprawie biggrin.gif

Myślałem jak to zrobić ale bez echa to nie da rady chyba,

mam klasę query która zapytanie do bazy wykonuje, i tak kod muszę stworzyć żeby w pliku index.php jedynie napisać np:

  1. $q = new query;
  2. $q->query($zapytanie);


I w zależności czy jakiś błąd wystąpi w funkcji query błąd się na ekran wypisać ma ale skoro w klasie nie mam echo i tutaj nie mam echo to nie da się tego rozwiązać przecież, a za każdym razem sprawdzać czy zapytanie się powiodło w index.php to wg mnie co najmniej głupota, to ma robić za mnie klasa i wyświetlać błędy biggrin.gif
viking
Przechytywaniem błędów (czyli wyjątków) ogólnych powinna zając się aplikacja. Akurat query zwraca zazwyczaj zbiór wyników lub nic więc jest najprostszym przykładem. Później w widoku iterujesz tylko po otrzymanych wynikach.

pseudokod:
  1. try {
  2. $db->beginTransaction();
  3. result = $db->query();
  4. $db->commit();
  5. //jakieś dodatkowe warunki jak trzeba if (result) costam
  6. View::render(['wyniki' => $result]);
  7. } catch (EException $e) {
  8. $db->rollback();
  9. Logger::error('błąd zapytania');
  10. View::render('jakiś błąd');
  11. }
Fred1485
Troche ciezkie to dla mnie nie ukrywam, wyjątki znam i je stosuje ale do czego w twoim kodzie mialy by sluzyc poszczególne funkcje?

@EDIT

Tutaj korzystałeś z PDO?
untorched
To jest pseudokod, ale PDO się nada do takiego użycia.
Turson
Widać, że to tylko przykładowa klasa do bazy danych, nie konkretnie PDO ani nic innego.
Boshi
Ludzie powinni nauczyć się słowa pseudokod bo potem dostają funkcję do_something_or_nothing (arg) i kopiują zywcem biggrin.gif
com
@up a gdzie autor napisał że coś przekopiował.

Fred1485

No ale nikt nie powiedział że w miejscu gdzie operujesz na zwróconych danych nie może być echo.
W tym twoim przykładzie zwracasz sobie dane z zapytania do bazy a potem już na nich operujesz czyli robisz jakiegoś foreach czy cokolwiek.
Przykład:
http://forum.php.pl/index.php?s=&showt...t&p=1151267
Fred1485
Zabiorę się lepiej za PDO, na pewno na darmo nie pójdzie a zobaczę różnice
com
Owszem warto poznać i mysqli i pdo ale wiele rzeczy jest tam podobnych do siebie smile.gif
Boshi
com, a widzisz w poście wikinga, informację, że to pseudokod? więc nie wiem po co pytanie czy to pdo czy cokolwiek innego...
Fred1485
Ale korzystając z PDO chcący stworzyć własną klasę obsługującą to wszystko, a potem w pliku dawać przykładowe

  1. $a = new klasa_pdo;
  2.  
  3. $a->query_database($jakies_zapytanie)


chcąć korzystać z preparowania danych ciężko to będzie zrobić?
com
Po pierwsze obudowanie PDO to trochę jest bez sensu bo co to niby daje, ale jak przekażesz sobie array ze zmiennymi to co za problem to zbindować z niego smile.gif
Fred1485
I za każdym razem jak zapytanie chcę zrobić to powtarzać to?

  1. $stmt = $database->prepare('SELECT * FROM settings WHERE id = :id');
  2. $stmt->bindValue(':id', 1, PDO::PARAM_INT);
  3. $stmt->execute();
  4. $row = $stmt->fetch();


dla mnie bez sensu
johny_s
to sobie to zamykasz w funkcji i wywołujesz tylko funkcje
Fred1485
Ale i tak będę to musial przystosować do roznych zapytan z preparowaniem. Dobra czas do roboty w praktyce wyjdzie może

Próbowałem to jakoś zrobić, żeby sobie stworzyć funkcję i nie pisać za każdym razem:

  1. $stmt = $database->prepare('SELECT * FROM settings WHERE id = :id');
  2. $stmt->bindValue(':id', 1, PDO::PARAM_INT);
  3. $stmt->execute();
  4. $row = $stmt->fetch();


W postaci tablic odpowiednie wartości przesyłałem, np:

  1. $connection->query(array('query' => 'SELECT * FROM settings WHERE id = :id', 'values' => array(':id' => $id)));


Chcąc dodać jeszcze typ zmiennej musiałbym 3-wymiarową tablicę zrobić smile.gif
To się stanie jeszcze bardziej skomplikowane niż "normalne" wywoływanie.

Czy pisząc w PDO za każdym razem programiści taki

  1. $stmt = $database->prepare('SELECT * FROM settings WHERE id = :id');
  2. $stmt->bindValue(':id', 1, PDO::PARAM_INT);
  3. $stmt->execute();
  4. $row = $stmt->fetch();


kod wykonują z każdym zapytaniem? chyba nie..
Turson
Jeżeli piszesz czystym PDO to tak się pisze. Co innego jeżeli korzystasz z ORM
Fred1485
Są w necie dostępne jakieś CMS'y w oparciu o PDO?
Turson
  1. $stmt = $database->prepare('SELECT * FROM settings WHERE id = :id');
  2. $stmt->bindValue(':id', 1, PDO::PARAM_INT);
  3. $stmt->execute();
  4. $row = $stmt->fetch();

Jeżeli wstawiasz wartośc w zapytaniu na sztywno, która nie pochodzi z $_GET/$_POST itd. to możesz uzyć skroconej wersji bez bindowania.
Fred1485
Czyli nie ma żadnego sensu opakowywać tego w klasę albo jakąś funkcje jak wyżej koledzy napisali?
Turson
Zależy... Co w ogóle widzisz złego w czystym PDO? Jeżeli chcesz, możesz napisać do tego nakładkę
Fred1485
No nie nie. Nie nam nic do czystego pdo alr chciałem ten problem z długością zapytania rozwiązać ale na jedno by mi wyszło
com
Cytat
Jeżeli wstawiasz wartośc w zapytaniu na sztywno, która nie pochodzi z $_GET/$_POST itd. to możesz uzyć skroconej wersji bez bindowania.


Oj nie kolego smile.gif bindowanie ma chronić przed błedem programistów jak i celowym działaniem osób 3 smile.gif
Fred1485
Czyli bindowanie w KAŻDYM zapytaniu?
Turson
Cytat(com @ 3.04.2015, 17:26:04 ) *
Oj nie kolego smile.gif bindowanie ma chronić przed błedem programistów jak i celowym działaniem osób 3 smile.gif

Niekoniecznie. Zależy od człowieka i sytuacji wink.gif
com
no ale nie ma ludzi nieomylnych, można pominąć tylko wtedy nie gwarantujesz że skrypt jest bezpieczny smile.gif

Dlatego własnie mysql stał się deprecated a w 7 ostatecznie zostanie usunięty, bo nie było bindowania smile.gif
Turson
Przykładowo chcesz pobrać główne kategorie
'SELECT * FROM categories where parent_id = 1'
co tu bindować? Chyba tylko idiota zrobiłby tu błąd i nie zauważył w testach
com
ok ale nie mówię już o takim niski poziomie, bo zapytania jak powyżej zdarzają się raz na parę tysięcy a może nawet rzadziej smile.gif tu masz rację tego można nie zbindować i nic się nie stanie, ale kiedy przekazujemy coś ze zmiennej a nie tak, choc ta zmienna wcale nie musi pochodzić z GET/POST to już wtedy jednak zaleca sie bindować smile.gif
Turson
Aa no widzisz, mówię tylko o tego typu zapytaniach, nie innych wink.gif
Fred1485
Przerywając wasze ciekawe dyskusje biggrin.gif

  1. public function query($query = FALSE) {
  2.  
  3. try {
  4.  
  5. $this->query = $query;
  6. if($this->connection == FALSE || $this->query == FALSE) {
  7.  
  8. throw new Exception('DO DOPRR', 1); //do zrobienia !!!
  9. }
  10. $this->stmt = $this->connection->prepare($this->query);
  11. }
  12. catch(PDOException $e) {
  13.  
  14. $this->error(array('text' => $e->getMessage(), 'code' => $e->getCode()));
  15. }
  16. catch(Exception $e) {
  17.  
  18. echo $e->getMessage();
  19. }
  20. }


Tworzę nakładkę na PDO bo chcę trochę OOP zasysnąć biggrin.gif
W konstruktorze tworzę połączenie z bazą, czy jest jaki sens sprawdzać czy jest połączenie skoro tworząc nową instancję tej klasy w konstruktorze, wyjątek zostaje przechwycony i zostaje wyświetlony stosown6y komunikat + die();
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.