Witajcie, chciałem was prosić o opinie a raczej merytoryczny hejt (IMG:
style_emoticons/default/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
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
echo $input->file->tmp_name; echo $input->file->error; 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:
echo $input->files[0
]->name;
a tutaj wspomniana klasa:
<?php
// klasa pojedyńczego pliku
private $name;
private $type;
private $tmp_name;
private $error;
private $size;
private $extension;
public function __construct($file){
$this->name = $file['name'];
$this->type = $file['type'];
$this->tmp_name = $file['tmp_name'];
$this->error = $file['error'];
$this->size = $file['size'];
//przypisanie rozszerzenia pliku do pola $extension
$extension= explode(".",$file_name); $this->extension = end($extension); }
//pobranie szukanej właściwości
public function __get($name){
if (isset($this->$name)) return $this->$name; }
}
class Post{
public function __construct(){
foreach($_POST as $post => $value){
$this->post[$post] = $this->safe_variable($value);
}
}
//pobranie szukanej właściwości
public function __get($name){
if (isset($this->post[$name])) return $this->post[$name]; }
//funkcja zabezpieczająca dane pobrane od użytkownika
private function safe_variable($variable)
{
return $variable;
}
}
//klasa pobierająca dane od użytkownika file / get / post
class Input{
private $input_files = array();
function __construct(){
//sprawdzamy czy uzytkownik przesłał plik
//jeśli przesłał definiujemy tablice z nazwy każdego inputa file
foreach($_FILES as $name => $wartosc){
$input_files[$name] = array(); }
//analizujemy każde pole input type file
foreach($input_files as $name_input => $value){
//sprawdzamy czy przesyłamy tylko jeden czy więcej plików w danym polu
if(count($_FILES[$name_input]['tmp_name']) > 1){
//aktywujemy obsługę wielu plików
//przepisujemy dane pochodzące od $_FILES na normalną tablicę
foreach ($_FILES[$name_input] as $key => $value) {
foreach($value as $index => $val){
$temp[$index][$key] = $val;
}
}
//tworzymy nowy obiekt dla każdego pliku
foreach ($temp as $file){
$temp_files[] = new File($file); }
//przypisujemy wszystkie pliki danego inputa do niego
$this->input_files[$name_input] = $temp_files;
}
//jeśli w inpucie przesyłamy tylko jeden plik przypisujemy tylko jeden plik
else{
$this->input_files[$name_input] = new File($_FILES[$name_input]); }
}
}
//przypisujemy do zmiennej post i get informację pobrane od użytkownika
foreach($_GET as $post => $value){
$this->post[$post] = $this->safe_variable($value);
}
$this->post = new Post();
}
//zwracamy wybraną wartość
public function __get($name)
{
switch($name){
//jesli szukamy danych w obiekcie typu post
case 'post':
return $this->post;
// w przypadku szukania danych w pliku file
default:
return $this->input_files[$name];
}
}
public function post($name)
{
return $this->post->$name;
}
}
- 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.