![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Здравствуйте, товарищи!
Помогите, пожалуйста, разобраться со следующим вопросом. Есть функция в классе, которая инклудит скрипты php из разных файлов. Возможно ли сделать inlude так как будто include был сделан не из класса, а из самого документа? т.е. есть класс Someclass $someclass= new Someclass; Все ключаемые скрипты тоже должны использовать $someclass, поэтому и возникает необходимость выполнить include как будто за пределами класса, иначе в функцию необходимо будет добаволять референсы на этот класс типа $someclass =& $this; , а этот вариант не очень удобен, т.к. заранее не известно как пользователь обзовет класс. Заранее премного благодарен! |
|||
|
||||
| awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: нет Всего: 31 |
вообще могу на 100% уверить что проблема в проектировании а не в реализации.
вроде как так нельзя сделать, за то есть много других вкусностей. |
|||
|
||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Напротив, в проктировании все хорошо получается.
Все делается так, чтобы конечному пользователю было проще (просто написать вызов функции, а все остальное будет выполнять движок). В JavaScript, например, можно сделать просто eval - скрипт выполнится относительно функции, в которой он вызван, или можно window.eval - выполнится относительно всего документа, таким образом функция будет доступна во всем документе. Собственно говоря, аналогичное мне необходимо сделать и в PHP, чтобы функция была доступна во всем документе, а не только в функции, где был сделан include. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
А кто это у нас пользователь, который может писать php функции? Может пусть такой продвинутый пользователь попишет целые классы? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Вот как раз и не надо чтобы конечный пользователь писал кучу классов. Конечный пользователь может вообще плохо знать php, поэтому моя задача облегчить ему жизнь, отсюда возникает необходимость сделать такой include, чтобы функции заинклуденного файла не висели в классе, а были доступны везде.
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Хм..., возможно, лучше всего запоминаются собственные шишки
Вот решение проблемы - "как позволить юзеру грязными лапами залезть в код": - пропустить полученый от юзера текст через php с ключом t. Если php не выругался - молимся и вставляем этот код в специально обученый файл, который инклудится во внешнем блоке... Каждая такая вставка должна оформляться очень характеными блоками комментариев. - пишем специальную приблуду для извлечения функций из этого самого специального файла, на случай если грязные лапы юзера все таки убили нашу систему... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Никакой юзер никуда же не полезет.
Это всего лишь модули для сайта, которые должны выполнять определенные функции. И другой человек, который использует эти модули не должен вникать в них, а просто должен вызвать функцию и получить результат в нужно месте. Это сообщение отредактировал(а) anthonyBoard - 6.11.2008, 23:49 |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 11 Всего: 146 |
ksnk, на сколько я понял, под конечным пользователем anthonyBoard имеет ввиду PHP программиста пишущего какие-либо модули к его библиотеке/фреймворку/CMS/etc. И хочет сделать что-то вроде:
Естественно, это бред. Если пользователь в своих инкюдах не должен создавать сам экземпляры классов, а должен использовать единственный существующий, то для этого достаточно использовать паттерн singleton. |
|||
|
||||
| ksnk |
|
||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
Вообще-то функции, как раз таки и не висят в классе, а висят в этом самом "везде". Только переменную, описанную во включаемом файле будет довольно сложно выковырять без предобработки файла каким-либо парсером. К примеру, если нам приспичит подключить, хотя бы и предложеным sTa1kEr'ом способом, файл такого содержания
Писать-же классы вместо функций более кошерно, так как при использовании классов как-то не принято использовать глобальные переменные. Таким образом надобность в странной манипуляции с файлом-инклудом как-бы и отсутствует. sTa1kEr, Мне показалось, что система ориентирована на пользователей, плохо знающих PHP. Вероятнее всего, они при этом недостаточно четко смогут себе представить что такое паттерны программирования Мне, впрочем, самому удивительно, как при таком выборе уровня пользователей, автор намеревается сделать что-то живучее ? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||
|
|||||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Спасибо огромное за пример!
На счет бред это или нет, я просто всей картины не описал о том, что и куда, но судить все равно вам. У пользователя есть возможность объявлять и создавать свои экземпляры классов, просто есть несколько темплейтов, которые необдохидо заинклюдить, и к классам они никакого отношения не имеют. Дело все в том, что эти заинклюденные файлы используют тот же самый класс, который их и добавил. |
|||
|
||||
| anthonyBoard |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Что-то мне кажется, что вы не поняли что мне надо в итоге.
Есть класс, в котором содержатся нужные переменные и фунеции. При создании этот класс получает необходимые параметры из базы или из конфигурационных файлов, потом производит необходимые рассчеты и манипуляции с данными. Следущим этопом класса является то что он должен заинклюдить нужный теплейт (название которого он полчил в процессе). В этом теплейте результаты расчетов (которые хранятся в переменных класса) активно используются и выводятся в нужных местах. Вот упрощенный примерчик напишу: Класс
шаблон
и наконец исполняемый файл
Вот, думаю, теперь из примера понятно что должно быть. В классе инклюдится template, в котором используется тот же самый класс, который его инклюдил, но PHP таким образом его не увидит, если не добавить в функцию __construct() global $someclass - я бы так и сделал, но что если пользователь обзовет его не $someclass, а $cool (и в template соответственно) -тогда все полетит. |
||||||
|
|||||||
| awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: нет Всего: 31 |
anthonyBoard, 100% проблема при проектировании. если уж приходится инклудить файл с переменными, аж через другой класс, да еще что бы коду было все видно ...
|
|||
|
||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Может конечно это через пятую точку, но честно сказать, в моем случае сделать иначе будет как раз через пятую точку.
Можно сказать, что всегда есть выход чтобы это обойти и спорить с этим не буду, но в данном случае сделать в обход этого как раз будет некрасиво, нежели заинклудить хитрым образом. Долго объяснять все структуру движка, но она хорошо справляется со всеми задачами и все было прекрасно, но возникла необходимость в модификации, т.к. к одной странице может принадлежать один шаблон, а может два (один в другом), вот когда два как раз и приводит к кривому инклуду. И вариантов два.. - либо напрячь пользователя добавлять две строчки кода с ифами - либо оставить как было, но тогда с кривым инклудом Логично - что лучше конечного пользователя лишний раз не парить и не заставлять править то что уже есть и не забивать лишним голову. Этот пользователь должен просто написать $someclass->doit(); и получить результат, $someclass->dothat(); - и получить другой результат, а не дописывать какие-то еще условия, отсюда и возникает проблема, что инклуд должен делаться из функции класса и ни как иначе, к сожалению. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 1 Всего: 386 |
anthonyBoard, Ну, дык! Тогда sTa1kEr прав - действительно, singlton в зубы и на мины...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| anthonyBoard |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 11.8.2008 Где: Russia, Obninsk Репутация: нет Всего: нет |
Эх.. Все это не красиво получается. Наверное придется разрабатывать новую структуру модулей. Выручают конечно глобальные переменные, но все равно есть свои подводные камни.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |