Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]
Forum PHP.pl > Forum > Przedszkole
dawidg87
Witam.
Mam mały problem z tworzeniem skryptów w sposób obiektowy, trochę teorii a raczej dość dużo teorii jaką znalazłem w necie na ten temat przeczytałem i teraz proszę o pomoc w praktyce. Mam taki oto kod i komentarze w nim z wyjaśnieniami co ma co robić, jednak coś to nie chce działać tak jak ja bym chciał, no i nie wiem czy to dobrze wszystko pisze? Czy dobry styl i tok myślenia mam co do tworzenia obiektów i klas oraz ich metod?

  1. <?php
  2. //Jak stworzyć nowy obiekt no to wiem:
  3. // $X = new NowyObiekt;
  4. class NowyObiekt
  5. {
  6. ////Deklaracja właściwości obiektu///////////////////
  7. public $nazwaObiektu;
  8. public $kategoriaObiektu;
  9. public $wielkoscObiektu;
  10. public $wagaObiektu;
  11. public $wysokoscObiektu;
  12. //pierwsza funkcja w mojej klasie to właśnie ta standardowa której powinno się chyba używać, Znaczenie jej oczywiście
  13. //rozumiem, stosuję się ją przy przypisywaniu wartości danym parametrom obiektu poprzez deklaracje np.
  14. // $this -> nazwaObiektu = 'Jan Kowalski';
  15. // lub
  16. // $this -> wagaObiektu = 54;
  17. //No chyba, że coś źle zrozumiałem no to proszę o poprawienie mnie, i wyjaśnienie dlaczego stosuje się __set()
  18. public function __set($nazwa, $wartosc)
  19. {
  20. $this -> $nazwa = $wartosc;
  21. }
  22. //Kolejną funkcją dla tego obiektu jaką bym chciał stworzyć to będzie funkcjaj po zdeklarowaniu której zostaną
  23. //wyświetlone wszystkie informacje o obiekcje jaki został stworzony, no ale nie wiem jak dodać zależności aby to
  24. //był naprawde kod obiektowy. Zależności takie jak np. waga obiektu będzie zależała od jego wielkości, a znowu
  25. //wielkość od jego wysokości, nie wiem jak to napisać? czy użyć funkcji z parametrami czy nie? Ja to widzę tak:
  26. public function WyswietlInformacje()
  27. {
  28. echo "Informacje o Obiekcie: <br>";
  29. echo "Nazwa Obiektu: ". $this -> nazwaObiektu .".<br>";
  30. echo "Kategoria do której należy obiekt to: ". $this -> kategoriaObiektu .".<br>";
  31. echo "Wysokosc obiektu: ". $this -> wysokoscObiektu .".<br>";
  32. echo "Wielkosc obiektu: ". $this -> Wielkosc() .".<br>";
  33. echo "Waga obiektu: ". $this -> Waga() .".<br>";
  34. }
  35. //Tu znowu próba stworzenia funkcji podającej wielkość w zależności od wysokości
  36. public function Wielkosc($param)
  37. {
  38. $this -> $wysokoscObiektu = $param;
  39. switch ($this -> $wysokoscObiektu)
  40. {
  41. case ($wysokoscObiektu > 0) or ($wysokoscObiektu < 101) : $this -> wielkoscObiektu = 10; break;
  42. case ($wyskoscObiektu > 100) or ($wysokoscObiektu < 201) : $this -> wielkoscObiektu = 20; break;
  43. case ($wysokoscObiektu > 200) : $this -> wielkoscObiektu = 30;
  44. }
  45.  
  46. }
  47. // tak jak wyżej tylko dla wagi
  48. public function Waga()
  49. {
  50. switch ($this -> $wielkoscObiektu)
  51. {
  52. case ($wielkoscObiektu = 10) : $this -> wagaObiektu = 1000; break;
  53. case ($wielkoscObiektu = 20) : $this -> wagaObiektu = 2000; break;
  54. case ($wielkoscObiektu = 30) : $this -> wagaObiektu = 3000;
  55. }
  56. }
  57.  
  58. }
  59.  
  60.  
  61.  
  62. $x = new NowyObiekt();
  63. $x -> nazwaObiektu = 'Sosna';
  64. $x -> kategoriaObiektu = 'Drzewa';
  65. $x -> Wielkosc(50);
  66. $x -> WyswietlInformacje();
  67. ?>



to taki kompletnie bezsensowny skrypt, na którym chciałem sprawdzić czy coś z tego wszystkiego co poczytałem mi zostało, proszę o jakieś ukierunkowanie mnie, co robie źle? nad czym popracować? na co zwracać największa uwagę? No i co można by zmienić w tym czymś co napisałem aby to działało w miarę logicznie. Wydaje mi się, że dobrze to opisałem i łatwo dojdziecie do tego jak ma działać ta klasa, jeśli ten kod można nazwać rzeczywiście klasą. Bo może jednak źle to wszystko zrozumiałem i powinienem patrzyć na to wszystko pod trochę innym kontem?
Advance
  1. <?php
  2. public function __set($nazwa, $wartosc)
  3. {
  4. $this -> $nazwa = $wartosc;
  5. }
  6. ?>


Troszkę bez sensu __set zastosowałeś - taki kod się automatycznie wykonywuje przy $obiekt -> zmienna = $wartość;. Zastosowanie logiczniejsze to np.


  1. <?php
  2. public function __set($name, $var) {
  3. switch($name) {
  4. case 'wysokosc' : {
  5. if(!is_numeric($var) die('Wysokość MUSI być liczbą!');
  6. else $this->wysokosc = $var; 
  7. }
  8. break;
  9. }
  10. }
  11. }
  12. ?>


Krótko mówiąc - __set można używać do sprawdzania poprawności danych.
dawidg87
  1. <?php
  2. if(!is_numeric($var) die('Wysokość MUSI być liczbą!');
  3. ?>

hmmmm ciekawa ta funkcja is_numeric(), dopiero teraz dowiedziałem się o jej istnieniu tylko zastanawia mnie poco tam przed jej zdeklarowaniem umieściłeś ten wykrzyknik?
W więc jeszcze raz czyli funkcji __set do czego najczęściej się używa? No bo przykład ciekawy, sprawdzenie poprawności danych, czyli nic nie szkodzi o rozbudowanie ją o możliwość sprawdzenia kolejnych parametrów obiektu? np.

  1. <?php
  2. public function __set($name, $var) {
  3. switch($name) {
  4. case 'wysokosc' : {
  5. if(!is_numeric($var) die('Wysokość MUSI być liczbą!');
  6. else $this->wysokosc = $var;
  7. }
  8. break;
  9. case 'waga' : {
  10. if(!is_numeric($var) die ('Wada musi być liczbą');
  11. else $this -> waga = $var;
  12. }
  13. break.
  14. }
  15. }
  16. ?>


To tylko taki głupi przykład, no ale logicznie do tego podchodząc czy tak może być? Jeśli tak to już pomału zaczynam łapać.
Jak by ktoś mógł jeszcze podać jakieś inne zastosowania __set było by fajnie?

A co powiedzie o reszcie mojego kodu który wypociłem w pierwszym poście? Na razie go nie poprawiam, już wiem, że bezsensownie użyłem funkcji __set, no ale co dalej, tam można by zmienić na lepsze i dlaczego?
k_@_m_i_l
Cytat(dawidg87 @ 3.02.2008, 11:11:22 ) *
tylko zastanawia mnie poco tam przed jej zdeklarowaniem umieściłeś ten wykrzyknik?


Wykrzyknik służy do negacji wartości.Użyty jest po to by sprawdzić,że jeśli argument nie jest liczbą wypisać komunikat.
dawidg87
Cytat
Wykrzyknik służy do negacji wartości.Użyty jest po to by sprawdzić,że jeśli argument nie jest liczbą wypisać komunikat.


aha ale używa się go tylko przy schemacie IF...DIE...ELSE ? gdyby go nie było działanie było by odwrotne? znaczy gdyby była liczba wykonała by się instrukcja DIE a gdyby to nie była liczba instrukcja ELSE? czy źle myślę?
k_@_m_i_l
ogolny schemat instrukcji if...else jest taki :
if(warunek)
{
instrukcje wykonywane gdy warunek prawdziwy
}
else
{
instrukcje wykonywane gdy warunek fałszywy
}


  1. <?php
  2. if(!is_numeric($var)) die('Wysokość MUSI być liczbą!');
  3. ?>


można by było zapisać także w taki sposób
  1. <?php
  2. if(is_numeric($var))
  3. {
  4. $this->wysokosc = $var; 
  5. }
  6.  else
  7.  {
  8. echo 'Podana wartość musi być liczbą!';
  9. }
  10. ?>


A operatora negacji(!) można używać tam gdzie występują zmienne typu logicznego.Najcześcięj jest on używany właśnie w przypadku sprawdzania warunków.
nowotny
Czyli:
  1. <?php
  2. $int=3445;
  3. is_numeric($num);
  4. ?>

zwróci nam TRUE, a:
  1. <?php
  2. $int=3445;
  3. !is_numeric($num);
  4. ?>

zwróci FALSE...

możesz to sobie w myślach zamienić na isn't_numeric()... winksmiley.jpg
dawidg87
Ok dzięki panowie. Poczytałem i w miarę rozumiem. Doszedłem też do wniosku, że lepiej wezmę się za jakiś konkretny projekcik niż wymyślanie czegoś takiego. Więc zrobię sobie system logowania oparty o sesje, bazę mysql, obiektowe php.
I teraz pytanie doczytałem się, że przy mysql w wersji 5 i nowszej jest już wbudowana klasa o nazwie mysqli smile.gif można tego używać normalnie w skryptach? bez konieczności tworzenia swojej własnej klasy db? Czy raczej to jest mało wygodne?
No bo skoro mysqli istnieje to chcąc pisać skrypty obiektowe, bazę danych mamy już załatwionąsmile.gif
Jestem tylko ciekaw jak ta klasa jest zbudowana i jakie posiada możliwości, i w jaki sposób najbezpieczniej przechowywać dane do połączenia z bazą? Może config.php albo config.ini albo hmmm jakaś inna propozycja?

np. coś w tym stylu:

plik config.php
  1. <?php
  2. $host = 'localhost';
  3. $user = 'root';
  4. $password = 'krasnal';
  5. $dbName = 'krasnal';
  6. ?>


plik index.php
  1. <?php
  2. require('config.php');
  3.  
  4. @ $db = new mysqli($host, $user, $password, $dbName);
  5.  
  6. ?>


Czy takie rozwiązanie jest dobre?
No i jeszcze pytanko do tej @ którą niby powinno się dawać w linijce kodu który ustala połączenie z bazą danych. Opisano to jako operator tłumienia błędów. Tylko nie za bardzo rozumie co to znaczy? Mógłby ktoś przybliżyć powód zamieszczania tego operatora i co on konkretnie robi? I czy musi być umieszczony?
sticker
imo zapisy typu
  1. <?php
  2. $x->nazwaObiektu = 'Sosna';
  3. $x->kategoriaObiektu = 'Drzewa';
  4. ?>

uważam że są nie fajne, Naucz sie raczej korzystać ze zmiennych prywatnych i odpowiadających im getterów i setterów Kod zyska na przejrzystości i bezpieczeństwie przypadkowego użycia przypisań
k_@_m_i_l
@ to tak jak powiedziałeś operator tłumienia błędów.Jeżeli będziesz miał zapis :
  1. <?php
  2. $zmienna=12/0;
  3. ?>

to otrzymasz komunikat błędu dzielenia przez zero.

Natomiast taki zapis :
  1. <?php
  2. @$zmienna=12/0;
  3. ?>


nie pokaże ci błędu związanego z dzieleniem przez zero.
@ używana jest w sytuacjach gdy może się pojawić jakis nieprzewidziany błąd a ty chcesz uniknąć wyświetlenie tego błędu to stosujesz @.
nowotny
Cytat(dawidg87 @ 3.02.2008, 13:53:07 ) *
No i jeszcze pytanko do tej @ którą niby powinno się dawać w linijce kodu który ustala połączenie z bazą danych. Opisano to jako operator tłumienia błędów. Tylko nie za bardzo rozumie co to znaczy? Mógłby ktoś przybliżyć powód zamieszczania tego operatora i co on konkretnie robi? I czy musi być umieszczony?

W zależności od ustawień poziomu raportowania błędów na serwerze, niektóre funkcję mogą zgłaszać błędy lub wiadomości, chociaż poza tym będą działać poprawnie... ten operator powoduje że te błędy nie będą wysyłane do klienta (przeglądarki)... Ma to też wady: w przypadku zastosowania tego operatora debugowanie skryptów może być trudniejsze bo możemy stracić poł dnia na szukanie błędu o którym funkcja by nas poinformowała gdybyśmy tego operatora nie zastosowali...
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.