Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите разобраться с наследованием....

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
A1ex_1984
Отправлено: 29 Мая, 2014 - 17:25:48
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Май 2014  
Откуда: Одесса


Помог: 0 раз(а)




Всем доброго времени!
Не могу понять вот такую вещь....
Задача, такая: нужно записывать различные файлы в свои папки на сервере, т.е. текстовые файлы в папку text, картинки в images, mp3 в папку music и т.д.
Для унификации и простоты добавления кода для загрузки новых типов файлов в какие-либо другие папки решил сделать один общий абстрактный класс Upload, и наследовать его уже в классах UploadText, UploadImage, UploadMusic и т.д. Привожу код ниже...
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. abstract class Upload { //абстрактный класс для загрузки файлов
  3.      public static $dir; //директория для загрузки
  4.      
  5.      public static function uploadFile($file){
  6.           $uploadfile = self::$dir."/".$file["name"]; //указываем папку и имя файла
  7.      return move_uploaded_file($file["tmp_name"], $uploadfile); //для вывода инфы пользователю о результате записи
  8. }
  9.  
  10. class UploadText extends Upload { //класс кдля загрузки текстовых файлов
  11. public static $dir = "text"; //указываем директорию для загрузки text
  12. }
  13.  
  14. class UploadImage extends Upload { //класс кдля загрузки картинок файлов
  15. public static $dir = "images"; //указываем директорию для загрузки images
  16. }
  17.  
  18. UploadText::uploadFile($_FILES["text"]); //вызываем метод загрузки тестового файла
  19.  

Ну и т.д. ....
Так вот вопрос состоит в том, что в переменную $dir класса Upload не передается значение переменной $dir из класса UploadText. Почему???
 
 Top
IllusionMH
Отправлено: 29 Мая, 2014 - 18:14:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




A1ex_1984, если еще правильно помню, то self::$dir это обращание к свойству прописанному непосредственно в этом классе. Попробуйте $this->dir
 
 Top
Panoptik
Отправлено: 29 Мая, 2014 - 18:19:33
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




вообще идея конечно хорошая, но вы можете для себя определиться какие именно функции будут выполнять ваши классы? и какие существенные отличия у них будут?
если только директория для хранения, то имхо много классов - это лишнее


-----
Just do it
 
 Top
esterio
Отправлено: 29 Мая, 2014 - 18:32:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




 
 Top
EuGen Администратор
Отправлено: 29 Мая, 2014 - 18:34:51
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




A1ex_1984 пишет:
$uploadfile = self::$dir."/".$file["name"];


PHP:
скопировать код в буфер обмена
  1. $uploadfile = static::$dir."/".$file["name"];


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 29 Мая, 2014 - 18:40:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Используйте static вместо self. self - это всегда ссылка на этот класс. Описывается как Late Static Bindings: http://www.php.net/manual/en/lan...tic-bindings.php

Panoptik пишет:
если только директория для хранения, то имхо много классов - это лишнее

Замены условного оператора полиморфизмом, строго по Фаулеру.

Но лучше отказаться от статических членов, добавить фабрику, явно описать интерфейс - получится простой и легко расширяемый код.
Ну и, разумеется, объявить директорию protected.


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 29 Мая, 2014 - 19:28:30
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




Мелкий пишет:
Замены условного оператора полиморфизмом, строго по Фаулеру.

а еще есть такое
Цитата:
дополнительная абстакция может решить любую проблему кроме проблемы лишних абстракций
вот к чему я. нужно везде находить решения к месту а не лупить из пушек по комарам


-----
Just do it
 
 Top
EuGen Администратор
Отправлено: 29 Мая, 2014 - 19:44:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Panoptik пишет:
ужно везде находить решения к месту а не лупить из пушек по комарам

В зависимости от контекста, может быть той самой ошибкой, в которую так часто попадают новички. Если код будет использоваться единожды - то - возможно. Но в общем случае:

- Что, если мы захотим загружать файл не в локальную ФС, а передавать по сети?
- Что, если мы захотим добавить возможность фильтрации типа/расширения файла?
- А если нам будет нужно сжатие?
- Или мы захотим загружать не файл, а поток?
- {...}

Преждевременное решение - тоже не лучший вариант, однако, чаще всего, потраченные на архитектуру часы в прошлом сэкономят дни (месяцы) доработки в будущем.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 29 Мая, 2014 - 20:20:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Panoptik пишет:
дополнительная абстакция может решить любую проблему кроме проблемы лишних абстракций

Но абстракция же одна и та же - upload. Разная реализация.


-----
PostgreSQL DBA
 
 Top
A1ex_1984
Отправлено: 31 Мая, 2014 - 18:44:32
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Май 2014  
Откуда: Одесса


Помог: 0 раз(а)




Только спустя 2 дня смог добраться до своего проекта, пока только учусь и познаю основы ООП в PHP.

Спасибо, EuGen, так все заработало.

Panoptik пишет:
вот к чему я. нужно везде находить решения к месту а не лупить из пушек по комарам

Это не стрельба из пушек по воробьям, там как правильно подметил EuGen еще много чего делается с файлами и фильтрация и архивация, просто привел кусок кода...


esterio, спасибо за ссылку, вроде разобрался....
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB