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
Mefiuu
post
Post #2





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

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


Bardzo dziękuję za odpowiedzi i pomoc ! Crozin, Twoje uwagi okazały się bardzo pomocne. Zmieniłem nieco mój kod i obecnie wygląda on tak:

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


index.php
  1. <?php
  2.  
  3. include('class.uploader.php');
  4.  
  5. try {
  6. $upload = new Uploader('file','files');
  7. if ($upload->uploadFile()) {
  8. echo 'Udało się wysłać plik!';
  9. }
  10. }
  11. catch (Exception $e) {
  12. echo $e->getMessage();
  13. }
  14.  
  15. ?>



Mam teraz kolejne pytanie, czy poprawnie został użyty kod :

  1. if ($upload->uploadFile()) {
  2. echo 'Udało się wysłać plik!';
  3. }


?

Jednak dalej nie wiem, jak zmienić ten główny blok try-catch. 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?

@Spawnm:
Nie wiem czy o to Ci chodziło, ale teraz do konstruktora przekazuję nazwę $_FILES i jeśli jest to $_FILES['avatar'] to wystarczy że to do konstruktora przekażę. Czy źle zrozumiałem?
Ponadto pozbyłem się wyjątku w udanej operacji, oraz kodu html.

Dziękuję jeszcze raz za wszelką pomoc i proszę o kolejne uwagi.

Pozdrawiam.


P.S. Spawnm to Twoje 400 'Pomógł'. Gratulacje (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 13:29