[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Подключение файла через метод класса
Centurion
Оказывается, если инклюдить файл через метод класса, то содержимое подключается как бы в этот самый метод, и видит в своём окружении свойства и методы данного класса, но не видит глобальную среду (например, переменные, созданные в исходном файле (в который мы подключаем другой)).

Так же история, если мы подключим файл изнутри функции (процедурно).

Собственно проблема. Хотела сделать метод класса, который бы "безопасно подключал файл", т.е. делал бы проверку на его существование (file_exists()), например, и в случае ошибки показывал сообщение. Логично было создать для этого метод и прогонять подключение каждого файла через него.

Однако вышеописанная особенность свела хорошее начинание на нет. Теперь в подключенном файле к свойствам и методам класса я могу обратиться исключительно через this->, а к глобальным переменным даже пока и не знаю как (кстати, как?). В мануале в комментариях к статье Variable scope много людей с той же проблемой (только почти все они работали не через класс, а просто через функцию). Все советы сводятся, в основном, к тому, чтобы "смириться и все обращения к глобальным переменным в подключаемых файлах делать через GLOBALS[] ". Вот в этом комментарии описана практически в точности моя проблема (только опять же сделано процедурно): http://ru.php.net/manual/en/language.varia...scope.php#88689

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

Однако и от идеи с подключением через метод отказываться не хочется, ибо подход в общем-то правильный.

Вопрос: что делать в этой ситуации? Можно ли как-нибудь хитро подключить файл через метод класса и одновременно заставить вписать его в глобальную область видимости?

Если да, то как?

Если нет, как правильнее поступить в данной ситуации, чтобы всё вместе корректно работало?



Спустя 28 минут, 58 секунд (10.02.2012 - 13:00) m4a1fox написал(а):
Centurion
Я чет не понял в конечном результате.... если надо просто файл подключить, то чем не нравится file_exists(), а если надо подключить файл и работать с его данными, то почему нельзя использовать extend, да и к тому же еще ни кто не отменил (кажется) такую штуку как glob.

Спустя 15 минут, 40 секунд (10.02.2012 - 13:15) caballero написал(а):
подключать через include а не через require

Спустя 11 минут, 6 секунд (10.02.2012 - 13:26) killer8080 написал(а):
Цитата (caballero @ 10.02.2012 - 12:15)
подключать через include а не через require

и что это меняет?

Спустя 23 минуты, 14 секунд (10.02.2012 - 13:50) sharki написал(а):
т.е есть у нас класс
class bla {
var1 = 12;
var2 = 34;

method0(){...}

method() {
include(file.php);
}
}



исходные данные file.php тут ты можешь обратиться к св-вам и методам класса, в котором этот файл подключен, так?

<?php
this
->var1 и т.п?
....
....



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

Спустя 8 минут, 20 секунд (10.02.2012 - 13:58) killer8080 написал(а):
sharki
я так понял имеется ввиду
file.php
<?php
$var1 = 1;
$var2 = 2;

class Test(){
public function func(){
include 'file.php';
}
}

$obj = new Test;
$obj->func();
echo $var1;

единственное нормальное решение - global $var;

Спустя 8 минут, 42 секунды (10.02.2012 - 14:07) sharki написал(а):
таак, по примеру killer8080 можно попробовать сделать так, правда не оптимизировано

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

Было бы грамотнее подключаемый файл сделать классом, и работать уже с объектом в целом, тогда будет доступно всё и вся.

file.php
<?php
$var1 = 1;
$var2 = 2;



class Test(){
public $includeNameFile = 'file.php'
public function func(){
include $this->includeNameFile;
}
public function getVarFromIncludeFile($nameVar){
include $this->includeNameFile;
return ${$nameVar};
}
}




$obj = new Test;
$obj->func();
echo $obj->getVarFromIncludeFile("var1");



Спустя 8 минут, 22 секунды (10.02.2012 - 14:15) killer8080 написал(а):
sharki
А если там сотня переменных, тогда нужно по отдельности запрашивать каждую, геморно как то. Да и многократно инклюдить один и тот же файл, то же не есть гуд.

Спустя 1 минута, 49 секунд (10.02.2012 - 14:17) sharki написал(а):
killer8080
Вот последствия неправильной архитектуры приложения

Спустя 6 минут, 14 секунд (10.02.2012 - 14:23) killer8080 написал(а):
Цитата (sharki @ 10.02.2012 - 13:17)
Вот последствия неправильной архитектуры приложения

Согласен. Я то же склоняюсь к мнению, что автору нужно пересмотреть архитектуру.

Спустя 17 минут, 20 секунд (10.02.2012 - 14:40) killer8080 написал(а):
на ум пришел такой костыль
function get_include_vars($file){
if(!file_exist($file))
return;

include $file;
$vars = get_defined_vars();
$glob = array('GLOBALS', '_POST', '_GET', '_COOKIE', '_FILES', '_SERVER');
foreach($vars as $k => $v){
if(!in_array($k, $glob))
$GLOBALS[$k] = $v;
}
}

Спустя 25 минут, 34 секунды (10.02.2012 - 15:06) Centurion написал(а):
Спасибо за ответы. Наверное, надо и правда как-то пересмотреть архитектуру.
Сейчас задача у меня такая: есть некая оболочка сайта, куда, в зависимости от переданных данных (методами GET или POST) передаётся нужное содержимое (форма ввода, выборка из базы и т.п.).
Впервые делаю подобное на ООП (для тренировки), сейчас у меня есть один класс, в котором лежат все необходимые методы обработки данных, + несколько внутренних файлов для подключения, в которых выполняются конкретные действия с помощью разных методов (обработка полученных данных и сохранение в базе, выборка и отображение определенным образом (с версткой) и т.д).

Прошу подсказать, если кто-то может, как такие задачи принято решать на ООП (либо дать ссылку на материалы, описывающие это, либо хороший пример, либо вообще направление куда копать) user posted image

Спустя 8 минут, 58 секунд (10.02.2012 - 15:15) killer8080 написал(а):
Centurion
почитай о фрейворках, например kohana
может будет полезно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.