Контекст объекта - Использование $this в PHP 5.3 против PHP 5.4

У меня есть веб-приложение, которое я создаю на платформе FuelPHP. Моя локальная среда разработки работает под управлением PHP 5.4, а мой сервер работает под управлением PHP 5.3. В моей среде разработки из моего основного файла шаблона я могу

<?php var_dump($this->active_request); ?>

Это приводит к тому, что куча данных о запросе (объект Fuel\Core\Request) сбрасывается в модальное диалоговое окно, к которому я могу обратиться. Однако, когда я пытаюсь запустить точно такой же сценарий на рабочем сервере (PHP 5.3), он выдает мне старое "ErrorException [Ошибка]: использование $this, когда не в контексте объекта"

Мне известно о разнице между использованием созданных объектов и статически доступными методами. У меня вопрос: почему разные версии PHP рассматривают один и тот же файл шаблона как имеющий другой контекст? Или есть какой-то другой нюанс конфигурации, который привел бы к явно различающимся функциональным возможностям этих двух сред?

2 ответа

Решение

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

$ this в представлении не должно работать, но, похоже, в PHP 5.4 он будет поднимать объект выше в стеке вызовов, так как он дает вам Request, а не View или ваш контроллер. Что уже указывает на то, что его использование ненадежно, так как то, что представляет $, будет зависеть от стека вызовов.

Даже если вы не используете движок шаблонов, считается плохой практикой использовать "логику" в ваших представлениях, отличную от логики, необходимой для генерации HTML. Передайте данные, необходимые для представления, либо из контроллера, либо используйте Viewmodel для подготовки данных.

Я не знаю FuelPHP, но похоже, что шаблоны включены в закрытие. Начиная с PHP 5.4 замыкания могут быть связаны с объектом и иметь $this, По умолчанию это объект, в котором было создано замыкание. Смотрите также: /questions/39824345/php-54-zakryit-etu-podderzhku/39824356#39824356

Другие вопросы по тегам