Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php]Początki OOP
Mefiuu
post
Post #1





Grupa: Zarejestrowani
Postów: 371
Pomógł: 18
Dołączył: 23.11.2008

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


Witam. Rozpocząłem żmudne zagłębianie się w tajniki programowania zorientowanego obiektowo, przeczytałem kilka artykułów i pomyślałem że najlepiej jest sprawdzić swoją wiedzę w praktyce. Tak oto powstała klasa do uploadu plików. Przyznam się, że pobrałem sobie podobną klasę z phpclasses.org, aby zobaczyć mniej więcej jak to wygląda. Chciałbym Was zapytać czy ma to coś w ogóle wspólnego ze stylem OOP ?

class.upload.php
  1. <?php
  2. class Upload {
  3. var $folder;
  4. var $types = array('application/msword', 'application/octet-stream', 'image/jpeg');
  5.  
  6. function __construct($folder) {
  7. $this->folder = $folder;
  8. $this->upload();
  9. }
  10.  
  11. public function check() {
  12. if (isset($_POST['wyslij'])) {
  13. if($_FILES['plik']['error']>0) {
  14. echo "Wystąpił problem: ";
  15. switch($_FILES['plik']['error']) {
  16. case 1: echo "rozmiar pliku przekroczył wartość xMB.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  17. case 2: echo "rozmiar pliku przekroczył wartość xMB.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  18. case 3: echo "plik wysłany częściowo.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  19. case 4: echo "nie wysłano żadnego pliku.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  20. case 6: echo "nie można wysłać pliku: nie wskazano katalogu tymczasowego.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  21. case 7: echo "nie zapisano pliku na dysku.<br /><a href='java script:history.back(1)'>Wróć</a>"; break;
  22. }
  23. }
  24. else {
  25. if (in_array($_FILES['plik']['type'], $this->types)) {
  26. return true;
  27. }
  28. }
  29. }
  30. }
  31.  
  32. public function upload() {
  33. if($this->check()) {
  34. if (is_uploaded_file($_FILES['plik']['tmp_name'])) {
  35. if(!file_exists($this->folder.'/'.$_FILES['plik']['name'])) {
  36. if(move_uploaded_file($_FILES['plik']['tmp_name'], $this->folder.'/'.$_FILES['plik']['name'])) {
  37. throw new Exception('Dodano plik pomyślnie');
  38. }
  39. else {
  40. throw new Exception('Nie dodano pliku!');
  41. }
  42. }
  43. else {
  44. throw new Exception('Taki plik już istnieje!');
  45. }
  46. }
  47. }
  48. else {
  49. throw new Exception('Niepoprawny typ!');
  50. }
  51. }
  52. }
  53. ?>



index.php
  1. <?php
  2.  
  3. include('class.upload.php');
  4.  
  5. try {
  6. $upload = new Upload('files');
  7. }
  8. catch (Exception $e) {
  9. echo $e->getMessage();
  10. }
  11.  
  12. ?>



Mam co do tego pytania :

1) Wiem że w stylu OOP są wyjątki. Czy to, jak ja je zastosowałem to odpowiednia metoda? Czy jest ich za dużo ? Bo mi nie pasują za bardzo ...
2) Czy wyjątki powinno się dawać do udanych operacji ?
3) Czy w konstruktorze wykonywać metodę 'upload' czy odwołać się do niej poza konstruktorem, już w pliku index?
4) Jeśli mam operacje na bazie danych bądź plikach tekstowych to czy tworzyć destruktor do ich zamykania ?

To takie ogólne pytania i byłbym bardzo wdzięczny gdyby ktoś mi to 'sprawdził', wytknął błędy i polecił dobrą literaturę (IMG:style_emoticons/default/smile.gif)

Dziękuję i pozdrawiam.

Ten post edytował Mefiuu 3.08.2011, 20:46:10
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Mam teraz kolejne pytanie, czy poprawnie został użyty kod :
Tak. Generalnie o to właśnie chodzi.

Jednak nadal pewne rzeczy są zrobione źle / w nienajlepszy sposób:
1. Zacznij korzystać z autoloaderów (jest wiele dobrych, gotowych rozwiązań).
2. Przykładaj większą uwagę do nazewnictwa. Nie ma to wpływu na działanie programu, ale zdecydowanie ułatwia korzystanie z niego. Zmienna $upload powinna raczej nazywać się $uploader w tym przypadku, $file (nazwa indeksu z tablicy $_FILES) jest dosyć myląca. W takim kontekście sugeruje ona raczej nazwę wgrywanego pliku czy coś takiego.
3. Jeżeli metoda checkType() jest wyłącznie do użytku wewnętrznego powinieneś ją oznaczyć jako niepubliczną.
4. Jak już wspomniałem: http://www.php.net/manual/en/features.file-upload.errors.php - to nieco oczyści kod.
5. Dlaczego metoda checkType(), której nazwa dosyć jasno wskazuje na to, że metoda sprawdza czy typ mime pliku jest odpowiedni zajmuje się jakimiś pierdołami w stylu sprawdzania błędów z $_FILES? To zadanie dla innej metody.
6.
  1. if (!in_array($_FILES[$this->file]['type'], $this->types)) {
  2. return false;
  3. }
  4. else {
  5. return true;
  6. }
  7.  
  8. // VS
  9.  
  10. return !n_array($_FILES[$this->file]['type'], $this->types);
Komentarz chyba zbędny?
7. Nadal używasz bezpośrednio klasy Exception. Nie powinieneś tego robić.
8. $_FILES['...']['type'] nie jest wiarygodnym źródłem danych - może być dowolnie modyfikowane. W tej chwili nie ma problemu by wgrać przykładowo plik PHP przez ten skrypt.

Cytat
Jednak dalej nie wiem, jak zmienić ten główny blok try-catch.
Przykład ilustrujący o co chodziło:
  1. <?php
  2.  
  3. try {
  4. // cała strona (cały system) tutaj
  5.  
  6. try {
  7. $uploader = new Uploader( ... );
  8. if ( ... ) {
  9. ..
  10. }
  11. } catch (FileUploadException $fue) {
  12. $this->showMessage($fue->getMessage());
  13. } catch (IOException $ioe) {
  14. // jakaś obsługa błędu po stronie serwera
  15. // albo jak się nic nie da sensownego zrobić:
  16. throw $ioe;
  17. }
  18.  
  19. // cała strona (cały system) tutaj
  20. } catch (Exception $e) {
  21. die('Coś się posypało, błąd krytyczny!');
  22. }


Cytat
Ponadto, jak Crozin wspomniałeś, nie powinienem stosować tablic globalnych, tylko je przekazywać do obiektu. W jaki sposób (przykładowo) mogę przekazać do obiektu tablicę $_FILES?
Tak jak masz obecnie nie jest najgorzej. Wątpię byś musiał się na chwilę obecną zamartwiać nad problemem uploadu pliku, który nie jest obsługiwany przez $_FILES, więc możesz zostawić jak jest.
Go to the top of the page
+Quote Post

Posty w temacie


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: 27.12.2025 - 16:39