| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Уничтожить функцию |
| Автор: AztEK 6.6.2006, 20:46 |
| Необходимо удалить ффункцию, чтобы потом можно было задать новую с этим же именем и не было redeclaire. В мануале о адресу http://ru.php.net/manual/ru/ref.funchand.php упоминается только unregister_tick_function, но это похоже не то...Помогите? |
| Автор: Mal Hack 6.6.2006, 21:13 |
| А зачем? Это противоречит принципам проектирования. Если тебе нужно реализовать перегрузку, то используй наследование в классах или создавай функцию динамически через create_function. |
| Автор: S.A.P. 6.6.2006, 21:52 |
| AztEK, собственно а как ты себе предсталяешь перегрузку функций в PHP? В PHP нет вложенных функций, функции компилируются сразу и вызываются вне зависимости от того, где были объявлены: выше, ниже, правее, левее... В соответствии с этим порядок компиляции твоих функций не зависит от логики программы, разве что через include из подключать. |
| Автор: AztEK 7.6.2006, 06:04 |
| 2all Пишу движок со сменными модулями. Если какой-то модуль регистрирут функцию, а другой регистрирует свою с этим же именем, получаем redeclaire... Serkys, хм...ты меня на мысль натолкнул...у меня модуль инклудится внутри функции(метода класса, если точнее), полученный контент буферизируется и складируется куда надо... При инклуде нового модуля вызывается новая версия этой функции... В этом случае можно что-нибудь сделать? Добавлено @ 06:05 Сегодня поэкспериментирую |
| Автор: Mal Hack 7.6.2006, 07:13 |
| Объекты надо использовать... |
| Автор: AztEK 7.6.2006, 08:06 | ||
В смысле? Каждый модуль - отдельный объект?? |
| Автор: Serkys 7.6.2006, 08:31 |
| AztEK, а почему нельзя сделать так: В конце названия функции подставляется microtime() и пишется в сессии какие-нибудь, или типа того. При вызове функции это microtime() достаётся и подставляется к имени функции. |
| Автор: AztEK 7.6.2006, 08:34 |
| Serkys, можно конечно, но это самый крайний вариант P.S. Как я оказывается плохо знаю PHP... |
| Автор: Serkys 7.6.2006, 08:42 |
| Можешь через function_exists проверять. Если определена, то в конец цифру. Если цифра есть - то цифру +1. А для удаления функции я что-то не нашёл... |
| Автор: AztEK 7.6.2006, 08:52 |
| Serkys это всё равно геморрой сильный... |
| Автор: Endeveit 7.6.2006, 11:10 | ||
Но всё это от лукавого. Советую пнуть гугл или яндекс на предмет "проектирование и разработка модульной cms", "разработка и проектирование сложных систем", "модульное программирование в пхп" ну и т.д. и т.п. |
| Автор: AztEK 7.6.2006, 11:13 |
| Endeveit, тот же способ, что и у Serkys'a! Создавать фукнции с динамическим именем я не хочу пока что... |
| Автор: Endeveit 7.6.2006, 12:29 |
| Не согласен. Serkys предложил подставлять в имя функции цифры, время, да ещё и в сессии всё класть. А я предлагаю создать подобие пространства имён. И иметь они будут не динамические имена, а статические. |
| Автор: Azazel 7.6.2006, 12:31 |
| А возможно просто для начала озвучится КОНКРЕТНЫЕ требования для которых данный гемморой надо? |
| Автор: AztEK 7.6.2006, 12:44 | ||||
| Endeveit, идентификатор модуля задаётся динамически, так что это всё же тоже самое Azazel
С удовольствием использую, только посоветуёте как. |
| Автор: Azazel 7.6.2006, 12:50 | ||
AztEK, да хоть и так:
надеюсь понятно. если нет - спрашивайте.... З.Ы. А вообще для такого глобального (?) проекта лучше использовать ООП - и геморроя меньше и взаимодействие станет нормальным, что при процедурном подходе практически невозможно, ИМХО |
| Автор: AztEK 7.6.2006, 12:58 |
| Я и так использую ООП. Дело в другом. Модули писать возможно не я буду, поэтому неизвестно, какие там будут функции, классы и объекты... Код я не понял |
| Автор: Endeveit 7.6.2006, 13:03 | ||||
| Название модуля тоже задаётся динамически? как я предлагаю сделать: Физическая структура системы:
в файле function.php храним все функции модуля, названия им даём по алгоритму: (Название модуля == названию папки)+нижнее подчёркивание+имя функции. В итоге имеем уникальные имена функций и можем к ним обращаться. На крайний случай, зная универсальное имя функции (пусть будет funcName) и имя модуля (пусть будет в переменной $modName), динамически вызываем функцию:
|
| Автор: AztEK 7.6.2006, 13:05 | ||
Вот это я и не хочу. Хочется попроще. Хотябы через ООП. |
| Автор: Azazel 7.6.2006, 13:12 |
| ну если Вы используете ООП, то моя конструкция должна была быть Вам понятной. если Вы в проекте используете ООП и разработка ведется нескольими разраотчиками то хорошо для каждого модуля сайта иметь отдельный класс; шанс что названия классов повторяться практически равен нулю (это при нормальном подходе к разделению проведения работ). Классы складируем в папку классы (использовать CVS хороший тон) загрузку их делать через __autoload (в РНР5), что бы небыло конфликтов имен у обьектов класса достаточно называть обьект так же (сомневаюсь что их от одного моделю будет много) или вести разработку: один модуль - один человек (одна группа). тогда конфликтов имен тоже не будет. модули собирать по отдельным папкам.... А вообще Вам еще рано за такие проекты садиться, ИМХО |
| Автор: Endeveit 7.6.2006, 13:19 | ||
да хотя бы и так: (версия для php4)
|
| Автор: AztEK 7.6.2006, 13:22 | ||
Azazel конструкция мне понятна. Непонятно её назначение в этом контексте.
Имена классов, ясень пень, должны быть индивидуальны среди классов модулей конкретного сайта. Чтобы добиться этого наверняка, придётся их идентифицировать среди всех модулей, что, понятно, недопустимо. Добавлено @ 13:27 Endeveit Сформулирую по другому. Требуется, чтобы каждый модуль движка мог задать свой набор функций такой, что ни онда из них не конфликтовала с уже созданными. При решении этого вопроса хочется не использовать функций, классов и объектов с динамически задаваемыми именами, поскольку это, как мне кажется, усложнит читабельность и гибкость кода. |
| Автор: Endeveit 7.6.2006, 13:34 | ||
AztEK, ты не хочешь "использовать функций, классов и объектов с динамически задаваемыми именами". А я тебе что предлагаю? Где там динамические имена? У нас есть модуль "Статьи", под него пишем класс и в этот класс кладём все функции, называй их как душе угодно. Просто при работе с модулем инициализуем объект "Статьи" и обращаемся к каждому из методов. и так для каждого модуля. Пример:
|
| Автор: AztEK 7.6.2006, 13:37 | ||
Endeveit
Articles и Guestbook. Эти имена задаются динамически. |
| Автор: Azazel 7.6.2006, 13:41 | ||||||||||
| ДЛЯ ТЕХ КТО В ТАКНЕ каждый модуль - класс (namespace - как Вам удобнее работать) в каждом класс есть набор функций которые могут дублировать себя в других классах (например в классе А и в классе Б есть функция В); исходя из идеологии и синфтаксиса ООП получаем, что
функции addRecord() никак между собой не связаны и выполняют принципиально разные действия. теперь смотрим на практику применения:
таким образом у нас есть два обьекта с методами (фугкциями) которые называются идентично, но:
делают принципиально разные вещи и им абсолютно пофик как названы методы в соседник классах, которыми оперируют соседнии объекты!!!!! РЕЗЮМЕ ДЛЯ ПОЛНЫХ ТАНКИСТОВ используя неймспейсы или классы мы тем самым никоим образом не зависим от ранее созданых и описаных функций. Классы и неймспейсы в данном контексте вашего вопроса выступают как префиксы персональных функций. /* выдохся - пошел пить чай */ надеюсь ТАК понятно? Добавлено @ 13:43
а это что еще за цирк? как так? Вы не знаете как будет называться модуль??? |
| Автор: AztEK 7.6.2006, 13:45 | ||
Имя каждого модуля создаётся динамически => имя класса создаётся динамичеси => противоречие условие задачи И "учить" меня элементарным вещам не надо. Добавлено @ 13:47 Azazel понятия не имею. Администратор CMS скачивает модуль, написанный третьими лицами. Система не знает ни кто писал этот модуль, ни его id, ибо задаётся он администратором при установке модуля. |
| Автор: Azazel 7.6.2006, 13:47 | ||||
вы создаете полиморфную систему, которая будет создавать себя сама? извините, но Вы пишите откровенный бред с точки зрения логики и программирования.... А учить видимо надо, так как этих "эдлементарных" вещей Вы как раз и не понимаете |
| Автор: IvanB 7.6.2006, 13:55 | ||
Если я правильно понял тебе просто необходим движок, поддерживающий подключение различных модуле. Так? |
| Автор: Endeveit 7.6.2006, 13:56 |
| Ключевое слово выделено жирным. Где было упомято об айдишнике? Извини, конечно, но у каждого модуля есть имя (название), заданное создателем, пусть даже создатель- матрица, программирующая сама себя. И имя это является статическим. Совсем необязательно [имя модуля] == id. Id- это некое внутреннее представление системы о подключенном модуле. |
| Автор: AztEK 7.6.2006, 13:56 |
| IvanB мне необходимо написать движок, поддерживающий подключение различных модулей. Да. |
| Автор: Azazel 7.6.2006, 13:59 |
| /* покинул топик ибо тут вссе запущено, ибо автор не ведает что творит */ |
| Автор: AztEK 7.6.2006, 14:04 | ||||
То есть по сути идентификатор, уникальный среди всех модулей системы (не только установленных на конкретном сайте!), иначе его смысл теряется.
Да, согласен. Так и есть. id задается при установке модуля, повторюсь. В любом случае использование задаваемое не системой имя цункции или класса сопряжено с большим геморроем. Этого я и хочу избежать. |
| Автор: Endeveit 7.6.2006, 14:22 | ||
Советую скачать скрипт более-менее крупной портальной модульной системы и посмотреть что там внутри (например http://www.ssrtech.com/rus/, хотя это может быть сложновато) Да, само-собой кладезь знаний- XPoint: http://xpoint.ru/forums/development/analysis/thread/28649.xhtml обязательно к прочтению (читать до полного просветления и ещё пару раз после оного) з.ы. как правильно было замечено Вами о себебез обид |
| Автор: IvanB 7.6.2006, 14:30 | ||||||
Ты не совсем понял автора. Бессмысленное сообщение.
Я делал как - есть XML файл со списком модулей вида
На главной странице происходит подгрузка необходимых модулей. (Возможно это не надо) Далее. Есть некий класс Modul. Базовые классы модулей наследуются от него. В нём есть некоторые методы. (/end) Я бы советовал копать в этом направлении. AztEK, или ты так и делаешь? |
| Автор: AztEK 7.6.2006, 14:35 | ||
IvanB я тоже беру список модулеё из XML.
Да, это здравая идея. Я тоже над этим думаю... Собственно всё упирается в том, что имя производного класса тоже должно быть уникально (ибо модули уникальны), и опять возвращаемся к первоначальной проблеме... |
| Автор: IvanB 7.6.2006, 14:37 |
| А производные классы модулей создаются не динамически. Их пишут программисты. И Имя класса - вещь, которая должна статической быть. И код класса, кстати, тоже. По другому делать, по моему скромному мнению, нерационально и ... |
| Автор: AztEK 7.6.2006, 14:42 | ||||
Нет. И какое оно будет? Должно быть уникально в пределах сайта. Я не вижу рациональных путей, чтобы этого добиться.
...и менее гибко. |
| Автор: IvanB 7.6.2006, 14:44 | ||
А так что не подходит? |
| Автор: AztEK 7.6.2006, 14:48 | ||
| Ну вы издевеетесь все чтоли? Имя "Forum" при подходе:
создается динамически, что неудобно в использовании. |
| Автор: IvanB 7.6.2006, 14:58 | ||
Вопрос - ты когда нибудь работал с классами в PHP? |
| Автор: AztEK 7.6.2006, 15:00 |
| IvanB да, работал. |
| Автор: Endeveit 7.6.2006, 15:29 |
| Мне кажется, что это ты над всеми издеваешься. Ещё мне кажется, что ты взялся за задачу, которая тебе не по зубам, т.к. сам не понимаешь чего ты хочешь "Машины делают машин! Какое извращение" (с) R2D2 "Звёздные войны. Эпизод 4."Ты уверен, что это был именно пхп и именно классы? Добавлено @ 15:29 Дружеский совет: всё-таки потрудись и попробуй последовать тому, что тут уже понаписали |
| Автор: Azazel 7.6.2006, 15:49 |
| Вобщем. исходя из вопроса топика "Как уничтожить функцию в РНР?" даю ответ который должен закрыть это обсуждение: в РНР не предусмотрено механизмов для переназначения функции. Надеюсь это то что Вы хотели узнать |
| Автор: Serkys 7.6.2006, 18:40 |
| Ну вы, блин, и флудеры. Azazel, так и надо |
| Автор: Mal Hack 7.6.2006, 23:37 |
| AztEK, про наследовние слышал? Эьто то, что тебе надо. Динамическое задание модуля, одинаковые имена функций. Все, ноу проблем. |
| Автор: AztEK 8.6.2006, 05:51 |
| Mal Hack всё это я понял давно. Чтобы не было redeclaire cllass, нужно задавать уникальные имена производных классов и их объектов. Как это рационально реализовать, я не знаю... |
| Автор: Mal Hack 8.6.2006, 06:53 | ||
Зачем? Ты просто подключаешь файл от нужного модуля, где находится класс. Все. |
| Автор: AztEK 8.6.2006, 07:14 | ||
А вдруг у разных модулей окажется класс с одинаковым именем? Я думаю разрегистрировать имя класса, как и функцию, невозможно... А делать статичное уникальное имя класса напряжно, посколько модули исать не только я буду. |
| Автор: Mal Hack 8.6.2006, 11:36 |
Дык в этом-то и фишка. Ты делаешь: include( "luboy_modul.php" ); $MDL = new ModulClasss(); Все. Тебе плевать какой модуль ты подключил. В конструкторе модуль уже начинает делать то, что он должен. |
| Автор: AztEK 9.6.2006, 10:48 | ||
Подключаться то будут несколько модулей! В этом вся фишка... |
| Автор: Mal Hack 9.6.2006, 11:45 |
Это не есть верно. Может быть ты столкнулся с моей проблемой 2 года назад. Вот почитай: http://forum.vingrad.ru/index.php?showtopic=48379&view=getnewpost |
| Автор: AztEK 13.6.2006, 08:32 |
| Нет, это не то... Ну ладно, видимо ничего лучше статичных идентификаторов не придумать...Всем спасибо за помощь... |