Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение include из класса 
:(
    Опции темы
anthonyBoard
Дата 6.11.2008, 17:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Здравствуйте, товарищи!

Помогите, пожалуйста, разобраться со следующим вопросом.

Есть функция в классе, которая инклудит скрипты php из разных файлов.

Возможно ли сделать inlude так как будто include был сделан не из класса, а из самого документа?

т.е. есть класс Someclass

$someclass= new Someclass;

Все ключаемые скрипты тоже должны использовать $someclass, поэтому и возникает необходимость выполнить include как будто за пределами класса, иначе в функцию необходимо будет добаволять референсы на этот класс типа $someclass =& $this; , а этот вариант не очень удобен, т.к. заранее не известно как пользователь обзовет класс.


Заранее премного благодарен!
PM MAIL   Вверх
awers
Дата 6.11.2008, 17:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



вообще могу на 100% уверить что проблема в проектировании а не в реализации.
вроде как так нельзя сделать, за то есть много других вкусностей.
PM MAIL WWW ICQ Skype   Вверх
anthonyBoard
Дата 6.11.2008, 19:38 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Напротив, в проктировании все хорошо получается.
Все делается так, чтобы конечному пользователю было проще (просто написать вызов функции, а все остальное будет выполнять движок).

В JavaScript, например, можно сделать просто eval - скрипт выполнится относительно функции, в которой он вызван, или можно window.eval - выполнится относительно всего документа, таким образом функция будет доступна во всем документе. Собственно говоря, аналогичное мне необходимо сделать и в PHP, чтобы функция была доступна во всем документе, а не только в функции, где был сделан include.
PM MAIL   Вверх
ksnk
Дата 6.11.2008, 20:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата

 чтобы конечному пользователю было проще

А кто это у нас пользователь, который может писать php функции? Может пусть такой продвинутый пользователь попишет целые классы?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
anthonyBoard
Дата 6.11.2008, 20:51 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Вот как раз и не надо чтобы конечный пользователь писал кучу классов. Конечный пользователь может вообще плохо знать php, поэтому моя задача облегчить ему жизнь, отсюда возникает необходимость сделать такой include, чтобы функции заинклуденного файла не висели в классе, а были доступны везде.
PM MAIL   Вверх
ksnk
Дата 6.11.2008, 21:04 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Хм..., возможно, лучше всего запоминаются собственные шишки smile

Вот решение проблемы - "как позволить юзеру грязными лапами залезть в код":

- пропустить полученый от юзера текст через php с ключом t. Если php не выругался - молимся и вставляем этот код в специально обученый файл, который инклудится во внешнем блоке... Каждая такая вставка должна оформляться очень характеными блоками комментариев.

- пишем специальную приблуду для извлечения функций из этого самого специального файла, на случай если грязные лапы юзера все таки убили нашу систему...





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
anthonyBoard
Дата 6.11.2008, 23:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Никакой юзер никуда же не полезет.
Это всего лишь модули для сайта, которые должны выполнять определенные функции. И другой человек, который использует эти модули не должен вникать в них, а просто должен вызвать функцию и получить результат в нужно месте.

Это сообщение отредактировал(а) anthonyBoard - 6.11.2008, 23:49
PM MAIL   Вверх
sTa1kEr
Дата 7.11.2008, 00:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



ksnk, на сколько я понял, под конечным пользователем anthonyBoard имеет ввиду PHP программиста пишущего какие-либо модули к его библиотеке/фреймворку/CMS/etc. И хочет сделать что-то вроде:
Код

class SomeClass
{
    public function myInclude($file)
    {
        extract($GLOBALS);
        include $file;
    }
}

$someObject = new SomeClass();
$someObject->myInclude('user_module.php');

Естественно, это бред. Если пользователь в своих инкюдах не должен создавать сам экземпляры классов, а должен использовать единственный существующий, то для этого достаточно использовать паттерн singleton.
PM MAIL   Вверх
ksnk
Дата 7.11.2008, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата

 функции заинклуденного файла не висели в классе...

Вообще-то функции, как раз таки и не висят в классе, а висят в этом самом "везде".
Только переменную, описанную во включаемом файле будет довольно сложно выковырять без предобработки файла каким-либо парсером.

К примеру, если нам приспичит подключить, хотя бы и предложеным sTa1kEr'ом способом, файл такого содержания
Код

<?php
$xx="It's me";

function my_function(){
    global $xx ;
    echo "Hello! It's my function";
    echo $xx ;
}
?>
, То функцию my_function можно вызвать из любого места далее по тексту. Сломается она только при выводе $xx. Чтобы углубиться еще дальше в это недоразумение, предобработка может быть, к примеру такой :
Код

$_GLOBAL['xx']="It's me";


Писать-же классы вместо функций более кошерно, так как при использовании классов как-то не принято использовать глобальные переменные. Таким образом надобность в странной манипуляции с файлом-инклудом как-бы и отсутствует.

sTa1kEr, Мне показалось, что система ориентирована на пользователей, плохо знающих PHP. Вероятнее всего, они при этом недостаточно четко смогут себе представить что такое паттерны программирования smile

Мне, впрочем, самому удивительно, как при таком выборе уровня пользователей, автор намеревается сделать что-то живучее ?  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
anthonyBoard
Дата 7.11.2008, 00:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Спасибо огромное за пример!

На счет бред это или нет, я просто всей картины не описал о том, что и куда, но судить все равно вам. У пользователя есть возможность объявлять и создавать свои экземпляры классов, просто есть несколько темплейтов, которые необдохидо заинклюдить, и к классам они никакого отношения не имеют. Дело все в том, что эти заинклюденные файлы используют тот же самый класс, который их и добавил.
PM MAIL   Вверх
anthonyBoard
Дата 7.11.2008, 01:39 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Что-то мне кажется, что вы не поняли что мне надо в итоге.

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

Вот упрощенный примерчик напишу:

Класс
Код

someclass.php
class Someclass{
   var $some = '';
   var $some_2 = '';
   functions __construct(){
      // манипуляции я все опущу
      $this->some = 'f***';
      $this->some_2 = 'off';

      include 'template.php';
   }
}

шаблон
Код

template.php
<div><? print "{$someclass->some} {$someclass->some_2}!"; ?></div>


и наконец исполняемый файл
Код

index.php
  include 'someclass.php';
  $someclass = new Someclass();



Вот, думаю, теперь из примера понятно что должно быть. В классе инклюдится template, в котором используется тот же самый класс, который его инклюдил, но PHP таким образом его не увидит, если не добавить в функцию __construct() global $someclass - я бы так и сделал, но что если пользователь обзовет его не $someclass, а $cool (и в template соответственно) -тогда все полетит.
PM MAIL   Вверх
awers
Дата 7.11.2008, 02:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



anthonyBoard, 100% проблема при проектировании. если уж приходится инклудить файл с переменными, аж через другой класс, да еще что бы коду было все видно ...
PM MAIL WWW ICQ Skype   Вверх
anthonyBoard
Дата 7.11.2008, 02:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Может конечно это через пятую точку, но честно сказать, в моем случае сделать иначе будет как раз через пятую точку.

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

Долго объяснять все структуру движка, но она хорошо справляется со всеми задачами и все было прекрасно, но возникла необходимость в модификации, т.к. к одной странице может принадлежать один шаблон, а может два (один в другом), вот когда два как раз и приводит к кривому инклуду.

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

Логично - что лучше конечного пользователя лишний раз не парить и не заставлять править то что уже есть и не забивать лишним голову.

Этот пользователь должен просто написать $someclass->doit(); и получить результат, $someclass->dothat(); - и получить другой результат, а не дописывать какие-то еще условия, отсюда и возникает проблема, что инклуд должен делаться из функции класса и ни как иначе, к сожалению.
PM MAIL   Вверх
ksnk
Дата 7.11.2008, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



anthonyBoard, Ну, дык! Тогда sTa1kEr прав - действительно, singlton в зубы и на мины...
Код

template.php
<div><? print "{someclass::dothat()} !"; ?></div>




 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
anthonyBoard
Дата 7.11.2008, 12:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.8.2008
Где: Russia, Obninsk

Репутация: нет
Всего: нет



Эх.. Все это не красиво получается. Наверное придется разрабатывать новую структуру модулей. Выручают конечно глобальные переменные, но все равно есть свои подводные камни.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0719 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.