Так же история, если мы подключим файл изнутри функции (процедурно).
Собственно проблема. Хотела сделать метод класса, который бы "безопасно подключал файл", т.е. делал бы проверку на его существование (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.
Я чет не понял в конечном результате.... если надо просто файл подключить, то чем не нравится 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 написал(а):
т.е есть у нас класс
исходные данные file.php тут ты можешь обратиться к св-вам и методам класса, в котором этот файл подключен, так?
а к каким переменным тебе не получается обратиться? дополни пример который выше, для наглядности задачи...
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
единственное нормальное решение - global $var;
я так понял имеется ввиду
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
так же если так делать, пропадает возможность работать с файлом как с одним экземпляром, т.е при повторном подключении по идее не будут видны изменения, которые возмжно были сделаны в методе 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) передаётся нужное содержимое (форма ввода, выборка из базы и т.п.).
Впервые делаю подобное на ООП (для тренировки), сейчас у меня есть один класс, в котором лежат все необходимые методы обработки данных, + несколько внутренних файлов для подключения, в которых выполняются конкретные действия с помощью разных методов (обработка полученных данных и сохранение в базе, выборка и отображение определенным образом (с версткой) и т.д).
Прошу подсказать, если кто-то может, как такие задачи принято решать на ООП (либо дать ссылку на материалы, описывающие это, либо хороший пример, либо вообще направление куда копать)
Сейчас задача у меня такая: есть некая оболочка сайта, куда, в зависимости от переданных данных (методами GET или POST) передаётся нужное содержимое (форма ввода, выборка из базы и т.п.).
Впервые делаю подобное на ООП (для тренировки), сейчас у меня есть один класс, в котором лежат все необходимые методы обработки данных, + несколько внутренних файлов для подключения, в которых выполняются конкретные действия с помощью разных методов (обработка полученных данных и сохранение в базе, выборка и отображение определенным образом (с версткой) и т.д).
Прошу подсказать, если кто-то может, как такие задачи принято решать на ООП (либо дать ссылку на материалы, описывающие это, либо хороший пример, либо вообще направление куда копать)

Спустя 8 минут, 58 секунд (10.02.2012 - 15:15) killer8080 написал(а):