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]   

> Описание: нужна помощь с итераторами...
MADONZY
Отправлено: 10 Мая, 2014 - 04:58:40
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




Доброе утро)
Подскажите пожалуйста аналогию вот этого (нужно узнать имена классов из подключенных фалов):
PHP:
скопировать код в буфер обмена
  1. $list = get_declared_classes(); // Объявленные классы до подключения
  2. // loop start
  3. // ...
  4. require_once $fileIt->current();
  5. // ...
  6. // loop end
  7. $this->_classes = array_diff(get_declared_classes(), $list); // Классы из файлов которые были подключены

но только с помощью отражения (Reflection).

и ещё вот это (может можно сделать как-то проще, но обязательно с помощью итераторов. (Цель - рекурсивно подгрузить все файлы из директорий, заданной директории("./classes"))):
PHP:
скопировать код в буфер обмена
  1. $dirIt = new DirectoryIterator("classes");
  2.  
  3. foreach ($dirIt as $children)
  4.         if($children->isDir() && !$children->isDot()) {
  5.                 $fileIt = new FilesystemIterator("classes/".$children);
  6.                 require_once $fileIt->current();
  7.         }
  8.        

Заранее благодарю Улыбка

(Отредактировано автором: 10 Мая, 2014 - 05:03:18)

 
 Top
teddy
Отправлено: 10 Мая, 2014 - 12:58:41
Post Id


Участник


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


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




Думается мне что Вы пытаетесь почесать правое ухо левой рукой. Тут не вооруженным глазом заметно что организация кода сильно хромает.
MADONZY пишет:
Подскажите пожалуйста аналогию вот этого (нужно узнать имена классов из подключенных фалов):

А можно узнать зачем? И
MADONZY пишет:
но только с помощью отражения (Reflection)

почему именно Reflection, особенно тогда, когда он так делать не может? Каждый Reflection работает скажем так "в своей области", ReflectionMethod например с методами, ReflectionClass - с конкретным классом и т.д. Не существует класса типа ReflectionIncludedFilesAsClasses s Улыбка

MADONZY пишет:
и ещё вот это (может можно сделать как-то проще, но обязательно с помощью итераторов.

Могу предложить использовать автолод и не грузить все классы подряд особенно тогда когда они не нужны.
 
 Top
MADONZY
Отправлено: 10 Мая, 2014 - 14:03:29
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




autoload не подойдет) так как я вообще не буду знать какие классы подключены, ведь объекты не создаются, значит автолоад не подходит.
Я вроде бы не сложные вопросы задаю(
 
 Top
LIME
Отправлено: 10 Мая, 2014 - 14:05:22
Post Id


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


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


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




а зачем это знать?
 
 Top
teddy
Отправлено: 10 Мая, 2014 - 14:15:49
Post Id


Участник


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


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




Цитата:
а зачем это знать?

и правда, зачем Вам это? Может Вы опишите задачу и кто нибудь подскажет более правильное решение?

Если очень хочется делать очень не корректно, тогда держите решение через ...(Reflection)
PHP:
скопировать код в буфер обмена
  1. foreach(get_declared_classes() as $class){
  2.     $rc = new ReflectionClass($class);
  3.    
  4.     if($rc->isUserDefined()){
  5.         echo $rc->getName();
  6.     }
  7. }

(Добавление)
P.S: echo count(get_declared_classes()) запустите этот код
У меня это число 213...

при таком подходе будет 213 итераций цикла + создание 213 объектов и 213 проверок на то пользовательский ли класс

Задумайтесь!

(Отредактировано автором: 10 Мая, 2014 - 14:25:24)

 
 Top
MADONZY
Отправлено: 10 Мая, 2014 - 15:04:50
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




LIME пишет:
а зачем это знать?

Задание такое. Есть страница О НАС на которой есть сайты, статьи и приложения (это всё ссылки на внешние ресурсы). Если пользователь хочет что-бы ссылки на его сайты, статьи и т.д. появились там, он должен у меня в папке Classes создать папку, с пофиг каким именем, в ней должен быть файл где храниться класс (пофиг какое имя файла), имя класса тоже пофиг, но он должен наследовать мой интерфейс. Так вот, нужно подключить все файлы и создать экземпляры классов только для тех, которые наследуют мой интерфейс. Далее вытягивать результаты их методов и заносить в массив, который позже нужно вывести списком html).
Я уже все сделал, просто эти 2 участка кода не понравились, поэтому и спрашиваю)
(Добавление)
teddy пишет:
при таком подходе будет 213 итераций цикла + создание 213 объектов и 213 проверок на то пользовательский ли класс

об этом и речь. Производительности - 0...
Поэтому и хочется узнать можно ли как-то упростить...

П.С: teddy, ваш код можно упростить если в else удалять созданный объект))
П.П.С: Но тем не менее)) Как лучше разрулить данную ситуацию)
 
 Top
LIME
Отправлено: 10 Мая, 2014 - 15:59:43
Post Id


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


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


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




MADONZY пишет:
П.С: teddy, ваш код можно упростить если в else удалять созданный объект))
выиграем в памяти потеряем в скорости
MADONZY пишет:
Как лучше разрулить данную ситуацию)
не давать юзерам пользовать твою систему своими классами в хвост и в гриву
в чем их цель?
нельзя им дать возможность просто править свои данные и всё?
 
 Top
MADONZY
Отправлено: 10 Мая, 2014 - 16:06:30
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




LIME пишет:
нельзя им дать возможность просто править свои данные и всё?

цель задания - научиться пользоваться отражением)
Я долго искал в гугле аналог, но не нашел, может его и не существует?

а что касательно упрощения:
PHP:
скопировать код в буфер обмена
  1. $dirIt = new DirectoryIterator("classes");
  2. foreach ($dirIt as $children) {
  3.         if($children->isDir() && !$children->isDot()) {
  4.                 $fileIt = new FilesystemIterator("classes/".$children);
  5.                 foreach ($fileIt as $file)
  6.                         require_once $fileIt->current();
  7.         }

может можно что-то придумать?)) но опять же таки с помощью итераторов)
(Добавление)
Может с помощь RecursiveDirectoryIterator? Но как?
 
 Top
MADONZY
Отправлено: 10 Мая, 2014 - 22:59:58
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




никаких идей?
 
 Top
teddy
Отправлено: 10 Мая, 2014 - 23:05:21
Post Id


Участник


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


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




Какие тут могут быть идеи? Никто так не делает даже под страхом смерти..
Записывайте и храните в БД эти данные и выводите где нужно. А пользователь пусть юзает ЛК либо пишите веб службу если хочется приключений
 
 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