Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Подключение файла через метод класса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: (проблемы, связанные с областью видимости содержимого подключенного файла)
centurion
Отправлено: 10 Февраля, 2012 - 11:44:24
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




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

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

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

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

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

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

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

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

Если нет, как правильнее поступить в данной ситуации, чтобы всё вместе корректно работало?
 
 Top
EuGen Администратор
Отправлено: 10 Февраля, 2012 - 11:58:25
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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

Стандартно используется __autoload - или её более общий вариант http://ru.php.net/manual/en/func...oad-register.php (который вдобавок еще и более универсальный). И вот уже внутри такой функции/класса загрузки можно создать логику по подключению кода, и это не нарушит прозрачности логики Вашего приложения.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 10 Февраля, 2012 - 12:01:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Отказать от самой идеи включать логику кусками в виде файлов и использовать классы с нативной для них spl_autoload.

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

Сама проверка правильности пути - это отдельная функция и не надо её мешать с include, они служат разным целям.


-----
PostgreSQL DBA
 
 Top
caballero
Отправлено: 10 Февраля, 2012 - 12:13:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




подключать через include а не через require


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB