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 :: Прошу помощи с ООП - OOP abstract class static self::

 PHP.SU

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


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

> Описание: Прошу помощи с ООП - OOP abstract class static self::
vyacheslavbely
Отправлено: 28 Ноября, 2013 - 15:12:03
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Окт. 2013  


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




Прошу помощи с ООП - OOP abstract class static self::

Хоть убейте не могу сделать код так чтоб все работало... Ошибки - то декларация не та, то со STATIC проблемы, то ABSTRACT CLASS неправильно определен...


Задача: написать класс для загрузки различных файлов на сервер. Работать все должно без создания объектов(без создания ссылок на объекты), использовать static =>

ИМХО: соответственно супер-класс должен быть абстрактным, иметь общий метод для загрузки файла, и абстрактный метод проверки файла(на тип/размер). А в дочернем классе реализовать метод проверки.

Я не знаю есть ли другие способы(если да, то подскажите пожалуйста), но чтобы вызвать какой либо метод, без объектов(ссылок на объекты) надо использовать инструкции типа: self:: или parent:: (или NAME_CLASS:Улыбка - но не одна из этих инструкций у меня не работает при вызове этого метода реализованного в дочернем классе. Я баловался со STATIC - перепробовал все варианты - но не работает - Всегда ошибки типа:
Фатальная ошибка: Декларация UploadFile :: CheckFile () должен быть совместим с публикации :: CheckFile ()


Индексный файл с формой для загрузки файлов:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. require_once 'lib/uploadfile_class.php'; // подключаем скрипт с абстрактным супер-классом Upload и дочернем UploadFile
  5.  
  6. if (isset($_POST['formUploud'])) {
  7.         echo '<pre>';
  8.         @print_r($_FILES['formUploud']); // debug: все то что ушло через post после клика по submit
  9.         echo '</pre>';
  10.  
  11.         if (isset($_FILES['formFile'])) {
  12.                 UploadFile::UploadFile($_FILES['formFile']);      // вызов метода из дочернего класса метода uploadFile(), без использования объектов
  13.  
  14.                 #$uploadFile = new UploadFile;                       // вызов метода из дочернего класса метода uploadFile()
  15.                 #$uploadFile->uploadFile($_FILES['formFile']); // с использование объектов
  16.         }
  17. }
  18.  
  19. @print_r(Upload::$whitetypes); // debug: баловался со static для переменной $whitetypes
  20.  
  21. echo <<<END
  22. <form action='index.php' method='post' enctype='multipart/form-data'>
  23. <pre>
  24. <!-- <input type='file'name='formFile' /> -->
  25. Text file       <input type='file'name='formFileText' />
  26. Image file      <input type='file'name='formFileImage' />
  27. Music file      <input type='file'name='formFileMusic' />
  28.  
  29. ? file          <input type='file'name='formFile' />
  30.  
  31. <input type='submit' name='formUploud' value='Send' />
  32. </pre>
  33. </form>
  34. END;
  35.  
  36. ?>
  37.  





А вот сам класс:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. abstract class Upload
  4. {
  5.         abstract protected function checkFile(); // баловался
  6.         #abstract public function checkFile();    // со STATIC
  7.  
  8.         public static $uploaddir = './upload';
  9.        
  10.         public static $whitetypes = array('txt', 'jpeg', 'gif', 'png', 'mp3'); // баловался
  11.         #public $whitetypes = array('txt', 'jpeg', 'gif', 'png', 'mp3');       // со STATIC
  12.  
  13.         public static function uploadFile($filename)
  14.         {
  15.                 if (!self::checkfile($filename)) return false; // имхо: главная проблема здесь при вызове через self::
  16.                 $uploadfile = self::$uploaddir.'/'.$filename['name'];
  17.                 return move_uploaded_file($filename['tmp_name'], $uploadfile);
  18.         }
  19. }
  20.  
  21. class UploadFile extends Upload
  22. {
  23.         public static $uploaddir = './upload/files';
  24.  
  25.         #public static function checkFile($filename) // баловался
  26.         protected  function checkFile($filename)     // со STATIC
  27.         {
  28.                 #$wt = self::$whitetypes;
  29.                 #$wt = self::$whitetypes;
  30.                 $wt = array('txt', 'jpeg', 'gif', 'png', 'mp3');
  31.                
  32.                 $type = false;
  33.                 foreach ($wt as $key => $value) {
  34.                         if (preg_match("/.*\.$wt[$key]\$/i", $filename['name'])) {
  35.                                 $type = true;
  36.                                 break;
  37.                         }
  38.                 }
  39.                 return $type ? true : false;
  40.         }
  41. }
  42. ?>
  43.  


Уже голова болит - у меня ломка мозга с этим ООП и с тремя китами... Не понял
Прошу помогите... Возможно ли вообще то, что я задумал(без объектов, и тд.)
Заранее СПАСИБО!
 
 Top
esterio
Отправлено: 28 Ноября, 2013 - 16:04:27
Post Id



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


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


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




а зачем статическые методы и свойства в абстрактном классе?

По сабжу: читайте Позднее статическое связывание

(Отредактировано автором: 28 Ноября, 2013 - 16:32:35)

 
 Top
caballero
Отправлено: 28 Ноября, 2013 - 16:18:08
Post Id


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


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


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




не очень понятно на фига тут классы и тем более наследование да еше и от абстрактного класса.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 28 Ноября, 2013 - 16:30:45
Post Id



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


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


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




vyacheslavbely пишет:
$wt = array('txt', 'jpeg', 'gif', 'png', 'mp3');

$type = false;
foreach ($wt as $key => $value) {
if (preg_match("/.*\.$wt[$key]\$/i", $filename['name'])) {
$type = true;
break;
}
}
return $type ? true : false; //зачем так? type и так булев

всего одна строка
PHP:
скопировать код в буфер обмена
  1. return in_array(pathinfo($filename['name'], PATHINFO_EXTENSION), $wt);
 
 Top
vyacheslavbely
Отправлено: 04 Декабря, 2013 - 13:57:20
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Окт. 2013  


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




Ребят, еще раз прошу прочитать внимательно мою просьбу!

Я сделал код - я знаю, как его делать с использованием ссылок на объект:
$object->method()
Все работает прекрасно и даже можно сделать проще.

Но есть задача, есть условие:
1) нужно использовать abstract класс
2) нужно вызвать метод вот таким образом class::method()

Вот index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. require_once 'lib/uploadfile_class.php';
  5.  
  6. if (isset($_POST['formUploud'])) {
  7.         if (isset($_FILES['formFile'])) {
  8.                 $uploadFile = new UploadFile;
  9.                 $uploadFile->uploadFile($_FILES['formFile']);
  10.         }
  11. }
  12.  
  13. echo <<<END
  14. <form action='index.php' method='post' enctype='multipart/form-data'>
  15. <pre>
  16. ? file          <input type='file'name='formFile' />
  17. <input type='submit' name='formUploud' value='Send' />
  18. </pre>
  19. </form>
  20. END;
  21.  
  22. ?>
  23.  


Вот upload_class.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. abstract class Upload
  5. {
  6.         #abstract protected function checkFile();
  7.        
  8.         protected $uploaddir = './upload';
  9.         public static $whitetypes = array('txt', 'jpeg', 'gif', 'png', 'mp3');
  10.  
  11.         public function uploadFile($filename)
  12.         {
  13.                 if (!$this->checkfile($filename)) return false;
  14.                 $uploadfile = $this->uploaddir.'/'.$filename['name'];
  15.                 return move_uploaded_file($filename['tmp_name'], $uploadfile);
  16.         }
  17. }
  18.  
  19. class UploadFile extends Upload
  20. {
  21.         protected $uploaddir = './upload/files';
  22.  
  23.         protected function checkFile($filename)
  24.         {
  25.                 $wt = parent::$whitetypes;
  26.                 $type = false;
  27.                 foreach ($wt as $key => $value) {
  28.                         if (preg_match("/.*\.$wt[$key]\$/i", $filename['name'])) {
  29.                                 $type = true;
  30.                                 break;
  31.                         }
  32.                 }
  33.                 return $type;
  34.         }
  35. }
  36.  
  37. ?>
  38.  



Как их переделать, так чтоб работала конструкция:
UploadFile::UploadFile($_FILES['formFile']);

вместо двух конструкций:
$uploadFile = new UploadFile;
$uploadFile->uploadFile($_FILES['formFile']);
 
 Top
Invert
Отправлено: 16 Декабря, 2013 - 23:35:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


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




vyacheslavbely пишет:
я знаю, как его делать с использованием ссылок на объект

Да не знаете вы нихрена. Зачем вам абстрактный класс? Вот спросите себя, ЗАЧЕМ? Есть внятный ответ? Вы лезете в электро-щиток, не понимая, чем отличается вольт от ампера.

Вот вам, читайте: Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования.
И не говорите, что знаете как пользоваться объектами, пока не прочтете.


Это что такое? $value вам зачем?

CODE (htmlphp):
скопировать код в буфер обмена
  1. $wt = parent::$whitetypes;

Зачем parent? В дочерном классе нет значения $whitetypes, то есть нужно использовать self::$whitetypes

esterio пишет:
Уже голова болит - у меня ломка мозга с этим ООП и с тремя китами...
Прошу помогите... Возможно ли вообще то, что я задумал(без объектов, и тд.)

Можно, и очень просто реализуется. Только нужно понимать, что такое вилка, чем она отличается от ложки, и как не выколоть глаз себе и соседу используя ее. Читайте книги, много читайте.

(Отредактировано автором: 16 Декабря, 2013 - 23:45:21)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB