Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa input - opinie
Forum PHP.pl > Forum > PHP > Object-oriented programming
marcus753
Witajcie, chciałem was prosić o opinie a raczej merytoryczny hejt wink.gif co zrobiłem źle tworząc swoją klasę input. Założenie było takie że klasa filtruje wszystkie dane pobierane od użytkownika jak również porządkuje pliki pobierane z inputów w przejrzyste obiekty.

po zaimplementowania klasy do zmiennych post możemy się dostać w taki sposób: (przy okazji zmienne są parsowane więc możemy je traktować jako bezpieczne

  1. echo $input->post->imie;
  2. echo $input->post('imie');


natomiast pliki odebrane od użytkownika odbieramy za pomocą: (dodatkowo dodałem pole extension więc wiemy z jakim rozszerzeniem jest każdy przesłany plik

  1. echo $input->file->name;
  2. echo $input->file->type;
  3. echo $input->file->tmp_name;
  4. echo $input->file->error;
  5. echo $input->file->size;
  6. echo $input->file->extension;


nazwa 'file' to nazwa inputa którym przesyłamy plik jeśli input nazwiemy moj_plik obiekt o takiej nazwie zostanie stworzony, na stronie możemy mieć wiele inputów oraz możemy przesyłać wiele plików w jednym inpucie, odwołujemy się do nich w taki sposób:

  1. echo $input->files[0]->name;


a tutaj wspomniana klasa:

  1. <?php
  2.  
  3. // klasa pojedyńczego pliku
  4.  
  5. class File{
  6. private $name;
  7. private $type;
  8. private $tmp_name;
  9. private $error;
  10. private $size;
  11. private $extension;
  12.  
  13. public function __construct($file){
  14. $this->name = $file['name'];
  15. $this->type = $file['type'];
  16. $this->tmp_name = $file['tmp_name'];
  17. $this->error = $file['error'];
  18. $this->size = $file['size'];
  19.  
  20. //przypisanie rozszerzenia pliku do pola $extension
  21.  
  22. $file_name = strtolower($this->name);
  23. $extension= explode(".",$file_name);
  24. $this->extension = end($extension);
  25. }
  26.  
  27. //pobranie szukanej właściwości
  28. public function __get($name){
  29. if (isset($this->$name)) return $this->$name;
  30. }
  31. }
  32.  
  33. class Post{
  34. private $post = array();
  35.  
  36. public function __construct(){
  37. foreach($_POST as $post => $value){
  38. $this->post[$post] = $this->safe_variable($value);
  39. }
  40. }
  41.  
  42. //pobranie szukanej właściwości
  43. public function __get($name){
  44. if (isset($this->post[$name])) return $this->post[$name];
  45. }
  46.  
  47. //funkcja zabezpieczająca dane pobrane od użytkownika
  48.  
  49. private function safe_variable($variable)
  50. {
  51. $variable = htmlspecialchars($variable);
  52. $variable = strip_tags($variable);
  53. return $variable;
  54. }
  55. }
  56.  
  57. //klasa pobierająca dane od użytkownika file / get / post
  58.  
  59. class Input{
  60.  
  61. private $post = array();
  62. private $get = array();
  63. private $input_files = array();
  64.  
  65. function __construct(){
  66.  
  67. //sprawdzamy czy uzytkownik przesłał plik
  68.  
  69. if(!empty($_FILES)){
  70.  
  71. //jeśli przesłał definiujemy tablice z nazwy każdego inputa file
  72. foreach($_FILES as $name => $wartosc){
  73. $input_files[$name] = array();
  74. }
  75.  
  76. //analizujemy każde pole input type file
  77. foreach($input_files as $name_input => $value){
  78.  
  79. //sprawdzamy czy przesyłamy tylko jeden czy więcej plików w danym polu
  80. if(count($_FILES[$name_input]['tmp_name']) > 1){
  81.  
  82. //aktywujemy obsługę wielu plików
  83. $temp = array();
  84. $temp_files = array();
  85.  
  86. //przepisujemy dane pochodzące od $_FILES na normalną tablicę
  87. foreach ($_FILES[$name_input] as $key => $value) {
  88. foreach($value as $index => $val){
  89. $temp[$index][$key] = $val;
  90. }
  91. }
  92.  
  93. //tworzymy nowy obiekt dla każdego pliku
  94. foreach ($temp as $file){
  95. $temp_files[] = new File($file);
  96. }
  97.  
  98. //przypisujemy wszystkie pliki danego inputa do niego
  99. $this->input_files[$name_input] = $temp_files;
  100. }
  101. //jeśli w inpucie przesyłamy tylko jeden plik przypisujemy tylko jeden plik
  102. else{
  103. $this->input_files[$name_input] = new File($_FILES[$name_input]);
  104. }
  105. }
  106. }
  107.  
  108. //przypisujemy do zmiennej post i get informację pobrane od użytkownika
  109.  
  110. foreach($_GET as $post => $value){
  111. $this->post[$post] = $this->safe_variable($value);
  112. }
  113.  
  114. $this->post = new Post();
  115. }
  116.  
  117.  
  118.  
  119. //zwracamy wybraną wartość
  120. public function __get($name)
  121. {
  122. switch($name){
  123.  
  124. //jesli szukamy danych w obiekcie typu post
  125. case 'post':
  126. return $this->post;
  127.  
  128. // w przypadku szukania danych w pliku file
  129. default:
  130. return $this->input_files[$name];
  131. }
  132. }
  133.  
  134. public function post($name)
  135. {
  136. return $this->post->$name;
  137. }
  138.  
  139. }


- myślałem tutaj o zastosowaniu interfejsów względem przyszłych klas post i get - jednak te klasy wystąpią tylko raz i innych tworzonych klas nie będzie więc to chyba bez sensu
- bardzo nie podoba mi się konstrukcja klasy post zależało mi na zachowaniu obecnego interfejsu jednak trzymanie defacto pól tej klasy w tablicy raczej jest rozwiązaniem mało obiektowy, myślę że powinienem tworzyć dynamicznie te pola w metodzie ? pytanie tylko co w sytuacji gdy chciałbym aby pola korzystały z atrybutów (private, protected).

Będę wdzięczny za krytykę sugestię itp. celem nadrzędnym jest nauka, drugorzędnym stworzenie funkcjonalnego narzędzia.
kayman
  1.  
  2. $variable = strip_tags($variable);
  3.  


taka sugestia

odbieram dane np. z TinyMCE i tracę wszystkie znaczniki html -> dobrze by było żeby była możliwość dopuszczenia podstawowych znaczników html jak a,p, span, ul, li etc

deklaracja tej funkcji raczej powinna wyglądać private function safe_variable($variable, $stripAllTags = true) i przy $stripAllTags == false powinna dopuszczać safe znaczniki html

pozdrawiam
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-2019 Invision Power Services, Inc.