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
Форумы портала PHP.SU :: Версия для печати :: Помогите разобраться с наследованием....
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Помогите разобраться с наследованием....

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

1. A1ex_1984 - 29 Мая, 2014 - 17:25:48 - перейти к сообщению
Всем доброго времени!
Не могу понять вот такую вещь....
Задача, такая: нужно записывать различные файлы в свои папки на сервере, т.е. текстовые файлы в папку 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. Почему???
2. IllusionMH - 29 Мая, 2014 - 18:14:22 - перейти к сообщению
A1ex_1984, если еще правильно помню, то self::$dir это обращание к свойству прописанному непосредственно в этом классе. Попробуйте $this->dir
3. Panoptik - 29 Мая, 2014 - 18:19:33 - перейти к сообщению
вообще идея конечно хорошая, но вы можете для себя определиться какие именно функции будут выполнять ваши классы? и какие существенные отличия у них будут?
если только директория для хранения, то имхо много классов - это лишнее
4. esterio - 29 Мая, 2014 - 18:32:07 - перейти к сообщению
5. EuGen - 29 Мая, 2014 - 18:34:51 - перейти к сообщению
A1ex_1984 пишет:
$uploadfile = self::$dir."/".$file["name"];


PHP:
скопировать код в буфер обмена
  1. $uploadfile = static::$dir."/".$file["name"];
6. Мелкий - 29 Мая, 2014 - 18:40:28 - перейти к сообщению
Используйте static вместо self. self - это всегда ссылка на этот класс. Описывается как Late Static Bindings: http://www.php.net/manual/en/lan...tic-bindings.php

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

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

Но лучше отказаться от статических членов, добавить фабрику, явно описать интерфейс - получится простой и легко расширяемый код.
Ну и, разумеется, объявить директорию protected.
7. Panoptik - 29 Мая, 2014 - 19:28:30 - перейти к сообщению
Мелкий пишет:
Замены условного оператора полиморфизмом, строго по Фаулеру.

а еще есть такое
Цитата:
дополнительная абстакция может решить любую проблему кроме проблемы лишних абстракций
вот к чему я. нужно везде находить решения к месту а не лупить из пушек по комарам
8. EuGen - 29 Мая, 2014 - 19:44:28 - перейти к сообщению
Panoptik пишет:
ужно везде находить решения к месту а не лупить из пушек по комарам

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

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

Преждевременное решение - тоже не лучший вариант, однако, чаще всего, потраченные на архитектуру часы в прошлом сэкономят дни (месяцы) доработки в будущем.
9. Мелкий - 29 Мая, 2014 - 20:20:55 - перейти к сообщению
Panoptik пишет:
дополнительная абстакция может решить любую проблему кроме проблемы лишних абстракций

Но абстракция же одна и та же - upload. Разная реализация.
10. A1ex_1984 - 31 Мая, 2014 - 18:44:32 - перейти к сообщению
Только спустя 2 дня смог добраться до своего проекта, пока только учусь и познаю основы ООП в PHP.

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

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

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


esterio, спасибо за ссылку, вроде разобрался....

 

Powered by ExBB FM 1.0 RC1