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
Форумы портала PHP.SU :: Версия для печати :: Подключение файла через метод класса
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Подключение файла через метод класса

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

1. centurion - 10 Февраля, 2012 - 11:44:24 - перейти к сообщению
Оказывается, если инклюдить файл через метод класса, то содержимое подключается как бы в этот самый метод, и видит в своём окружении свойства и методы данного класса, но не видит глобальную среду (например, переменные, созданные в исходном файле (в который мы подключаем другой)).

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

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

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

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

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

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

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

Если нет, как правильнее поступить в данной ситуации, чтобы всё вместе корректно работало?
2. EuGen - 10 Февраля, 2012 - 11:58:25 - перейти к сообщению
Неуниверсальность - это как раз пытаться ставить в зависимость глобальное исполнение приложения от некоторого класса. Иными словами, пытаясь воздействовать на глобальную область через метод такого класса, Вы создаете неочевидность при исполнении скрипта - а именно его логика становится динамической во время исполнения. Это плохая практика, так как снаружи никак нельзя догадаться, что тот или иной метод, помимо прочего, еще и подключает некоторый код.

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

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

Сама проверка правильности пути - это отдельная функция и не надо её мешать с include, они служат разным целям.
4. caballero - 10 Февраля, 2012 - 12:13:16 - перейти к сообщению
подключать через include а не через require

 

Powered by ExBB FM 1.0 RC1