Можно ли выгрузить файл из памяти, загруженный через require?

Anghram

Новичок
Можно ли выгрузить файл из памяти, загруженный через require?

Ситуация такая: есть несколько файлов с одинаковой функцией myFunction. Я в цикле подключаю нужный файл и вызываю эту функцию. При подключении второго файла, естественно, выдается ошибка о невозможности перезаписать функцию (названия одинаковые).

Вопрос:
Можно ли удалить файл из памяти? Типа:
Код:
require 'test.php'
myFunction();
unrequire 'test.php'
Или афтар мудаг и нужно-таки осваивать классы? :) Как я понимаю, эта проблема при использовании классов не появится.
 

Апокалипсис

тех дир matras.ru
переименовать функцию что то не позволяет?
или подключать файлы по условию с этой функцией
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Anghram
мей-би не нужно инклюдить, а вызвать функцию повторно, с другими параметрами...
 

Anghram

Новичок
Попробую иначе объяснить. Есть три файла: test1.php, test2.php, test3.php.

В каждом из них есть функция myFunction, которая выводит на сайте какой-то текст.

Я произвольным образом в цикле подключаю эти файлы. Подключаю НЕСКОЛЬКО сразу.

Сначала я подключил файл text3.php, вызвал функцию myFunction. Потом подключил файл test2.php, что выдаст ошибку о переназначении функции myFunction.

Если сделать уникальные имена функций, то в цикле мне будет на них не сослаться, только если делать функцию, включающую имя файла.
 

A1x

Новичок
придется тебе как-то выкручиваться - нельзя сделать unrequire и классы тут ни при чем...
 

Фанат

oncle terrible
Команда форума
Anghram
Твой вопрос из тех, которые ни перед кем другим не возникают. И ставят в тупик.
Это повод задуматься о том, что ты что-то делаешь неправильно.

Давай, рассказывай, без всяких тестов и майфункшенов, что у тебя за хитрая такая система. В реальности.
 

Anghram

Новичок
A1x
разве методы объектов разных классов должны иметь уникальные имена?

Фaнaт
Да все равно рассказ будет таким же непонятным. CMS парсит страницу на наличие тегов для подстановки. Если встречается тег с названием модуля, то подключается модуль, чтобы подставлять значение в этот тег (у каждого модуля несколько тегов, за которые он отвечает). Функция для всех модулей одинаковая, пусть будет function parse($content) {...}.
Т.е. подключил класс этого модуля, подставил содержимое. Если есть теги из других модулей - подключил, подставил...

Надеюсь, понятнее стало...
 

FractalizeR

Новичок
Автор оригинала: Anghram
Если сделать уникальные имена функций, то в цикле мне будет на них не сослаться, только если делать функцию, включающую имя файла.
То есть гениальный план состоял в том, чтобы при парсинге каждого тега выгружать/загружать файл с определенным модулем? Быстродействие было бы ужасным, если бы это даже и удалось...

В общем, если без классов, то, пожалуй, я бы сделал что-то вроде (внимание, псевдокод!):

global.php

PHP:
$tagHandlers = array();
loadAllTagHandlers();

function parseText($text) {
  while ($currentTag = getNextTag() ) {
  if(!in_array($currentTag, $tagHandlers))
     die('No tag handler for tag '.$currentTag);
  ${$tagHandlers[$currentTag]}($param); //вызываем  обработчик текущего тега
}
}

tag_handler_p.php
PHP:
function handle_tag_p($param) {...}

$tagHandlers ['p'] = 'handle_tag_p';
Идея понятна?

С классами вариант аналогичный. Абстрактный класс или интерфейс для определения сигнатур методов обработчиков тегов, затем от него наследуем (либо реализуем интерфейс) класс-обработчик каждого тега. Класс-коллекция для регистрирования обработчиков тегов. Файлы с обработчиками тегов складываем в отдельную папку и называем так, чтобы по имени файла можно было бы узнать имя класса обработчика тега. Перебираем файлы, создаем экземпляры классов (это даже по требованию можно делать, чтобы ресурсы не расходовать, типа "поздняя инстанциация" :) ), заносим их в коллекцию. Класс для парсинга текста его загружает, бьет на теги, по каждому тегу обращается в коллекцию, достает обработчик и.....
 

Anghram

Новичок
Автор оригинала: FractalizeR
То есть гениальный план состоял в том, чтобы при парсинге каждого тега выгружать/загружать файл с определенным модулем? Быстродействие было бы ужасным, если бы это даже и удалось...

В общем, если без классов
Собственно, вопрос про классы остается открытым. Методы разных классов могут иметь одинаковые имена?

Сорри, по ночам лишь флужу, на работе подумаю над твоим кодом. Спасибо!
 

FractalizeR

Новичок
По классам - я отредактировал свой пост. Если будет непонятно - скажите, попробую более подробно.

Методы разных классов одинаковые имена, разумеется, могут иметь.
 

AmdY

Пью пиво
Команда форума
Я вот думаю к классам послать или нэймспэйсам или на переделку архитектуры
 

FractalizeR

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

Если у вас PHP5 на хостинге - однозначно советую ООП (т.е. классы). Впрочем, даже если PHP4 - все равно советую :) Обойдётесь и без абстракции и интерфейсов
 

kode

never knows best
Автор оригинала: Anghram
Попробую иначе объяснить. Есть три файла: test1.php, test2.php, test3.php.

В каждом из них есть функция myFunction, которая выводит на сайте какой-то текст.

Я произвольным образом в цикле подключаю эти файлы. Подключаю НЕСКОЛЬКО сразу.

Сначала я подключил файл text3.php, вызвал функцию myFunction. Потом подключил файл test2.php, что выдаст ошибку о переназначении функции myFunction.

Если сделать уникальные имена функций, то в цикле мне будет на них не сослаться, только если делать функцию, включающую имя файла.
Может это банально и неправильно, но есть решение:
1) Что мешает использовать префиксы?
2) runkit - http://ru2.php.net/manual/en/ref.runkit.php

-~{}~ 15.01.08 10:19:

FractalizeR
ЭЭЭЭ....а где там псевдокод?
 

Anghram

Новичок
FractalizeR
есть ядро системы, и есть модули, которые никак не связаны с ядром. Систему нужно написать так, чтобы при подключении нового модуля не требовались какие-либо изменения в самом ядре. Насколько я понимаю, в твоем варианте обрабатываемые теги должны быть заранее описаны. Я правильно понял твой код?

-~{}~ 15.01.08 15:28:

kode
префиксы у функций? Некрасиво как-то.
 

FractalizeR

Новичок
Автор оригинала: Anghram
FractalizeR
есть ядро системы, и есть модули, которые никак не связаны с ядром. Систему нужно написать так, чтобы при подключении нового модуля не требовались какие-либо изменения в самом ядре. Насколько я понимаю, в твоем варианте обрабатываемые теги должны быть заранее описаны. Я правильно понял твой код?
Нет, неправильно. Где в моем коде требуется описание тегов? Модули ищутся и подключаются автоматом. Процедуры обработки тегов регистрируются динамически. tag_handler_p.php - пример файла модуля обработчика тега. Таких файлов - на каждый тег по одному.

2kode:
Сорри, немного не так выразился. Я имел ввиду, что не все функции, которые в коде использованы, в нем же реализованы :) Получается что-то вроде псевдокода. loadAllTagHandlers() вызывается, но тело этой функции нигде не описано :) Т.е. copy&paste не сработает :) :)
 

kode

never knows best
Автор оригинала: FractalizeR
2kode:
Сорри, немного не так выразился. Я имел ввиду, что не все функции, которые в коде использованы, в нем же реализованы Получается что-то вроде псевдокода. loadAllTagHandlers() вызывается, но тело этой функции нигде не описано Т.е. copy&paste не сработает
Я то понял что ты имеешь ввиду, но задал уточняющий вопрос чтобы другим понятно было :) Начитаются форума, а потом везде любой код псевдокодом называть начнут :)
 

FractalizeR

Новичок
Да. Она должна проходить по каталогу и загружать все файлы с обработчиками тегов
 
Сверху