Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przejście parametrów przez __set
Forum PHP.pl > Forum > Przedszkole
Yhy
Mam następny problem, fragment kodu -

  1. class Avatar{
  2.  
  3. public $file_size;
  4. public $file_type;
  5. public $file_tmp;
  6. public $file_name;
  7.  
  8. function __set($name, $value){
  9. if( ($name = "file_size") && ($value < 20000)){
  10. return $this->file_size = $value;
  11. }
  12. elseif( ($name = "file_type") && ($value == "image/jpeg" or "image/png")){
  13. return $this->file_type = $value;
  14. }
  15. else{
  16. echo 'Plik nie spełnia wymagań.';
  17. }
  18. }
  19.  
  20. public function upload(){
  21.  
  22. if( move_uploaded_file($this->file_tmp, "avatars/$this->file_name")){
  23. echo 'Plik został zauploadowany.';
  24. }
  25.  
  26.  
  27. }
  28.  
  29. }


  1. <?php
  2.  
  3. echo '<form action="#" method="POST" enctype="multipart/form-data">
  4. <input type="file" name="avatar">
  5. <input type="submit" name="submit" value="Wgraj">
  6. </form>';
  7.  
  8. if( isset($_FILES['avatar'])){
  9.  
  10. include('class.Avatar.php');
  11.  
  12. $avatar = new Avatar;
  13.  
  14. $avatar->$file_size = $_FILES['avatar']['size'];
  15. $avatar->file_tmp = $_FILES['avatar']['tmp_name'];
  16. $avatar->file_name = $_FILES['avatar']['name'];
  17.  
  18. $avatar->upload();
  19. }
  20.  
  21.  
  22. ?>


Błąd:

Cytat
Notice: Undefined variable: file_size in index.php on line 32
Plik został zauploadowany.


Problem - nie widzę błędu, ponieważ z tego co wiem znak dolara powodu przefiltrowanie parametru przez funkcję __set. Ponadto plik którzy wrzucam jest zbyt duży, więc powinien zostać odrzucony.
CuteOne
$avatar->$file_size = $_FILES['avatar']['size'];

podmień na

$avatar->file_size = $_FILES['avatar']['size'];
Yhy
Okej, do tego już doszedłem, z tym że funkcja __set nadal nie filtruje mi danych i przepuszcza pliki większe niż 20kb.

Ktoś może mi pomóc?
nospor
yhym chlopie, zapoznaj się z podstawami języka, w którym piszesz :/

if( ($name = "file_size")
= - przypisanie
== - porównanie

elseif( ($name = "file_type") && ($value == "image/jpeg" or "image/png")){
$value == "image/jpeg" or "image/png" - co to jest za jakis skrótowiec? W if mabyć warunek a nie jakiś skrót myślowy...

tak ma być
$value == "image/jpeg" or $value == "image/png"

Poza tym poczytaj o metodach magicznych __set oraz __get, a konkretnie kiedy one działają - tzn. kiedy są odpalane, bo u Ciebie nie będę odpalane nigdy.
Yhy
Z tego co wiem, to przed nazwą pola muszę dodać znak dolara, np.

  1. $obiekt->$pole = 20;


Z Tym że wtedy sypie mi błędem. Co do porównywania, przeoczenie.
nospor
A skąd ty to wiesz? Bo to jakaś bzdura.

Tu masz opisane kiedy działają __set
http://pl.php.net/manual/pl/language.oop5....loading.members
Zapoznaj się z podaną tam teorią, zapoznaj się z podanym przykładem, który teorię wyjaśnia. Odpal go sobie na kompie, zobacz co się dzieje.
Choć i tak wszystko wyjaśnia to jedno zdanie:
Cytat
__set() is run when writing data to inaccessible properties.
Yhy
http://www.youtube.com/watch?v=ZXrNeRcI9Xc

stąd, no ładnie, człowiek nie ma się z czego uczyć, a jak coś znajduje to jeszcze same głupoty.

Dzięki nospor, niestety nieudolnie się dokształciłem, poczytam.
nospor
Ałć.... zwracam ci honor. Faktycznie, nie Twoja wina, że na taki "zajebisty" kurs trafiłeś :/ Jak ludzie mogą coś takiego wypuszczać w świat?

Nawet tam jest porównanie tak zapisane:
if ($zm = 'costam')
:/

Choć wywołanie:
$obiekt->$pole = 20;
Też jest poprawne, ale tylko wówczas gdy istnieje zmienna $pole. Tutaj poprostu dobieramy się w dynamiczny sposób do pól.
Ale w tym kurscie co dałeś linka koleś to skopał i totalnie źle wyjaśnił, stąd nie miało to żadnego sensu w kodzie co ty pokazałeś w tym temacie.
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.