global не работает в представлениях CakePHP 2.1.1

Я использую PHP 5.3.8 с CakePHP 2.1.1.

Это мой вид (макет пустой, на самом деле он выводит только сам вид)

<?php   
// $present is not a view variable
$present = 'Hello World!';

class ApplicationsPDF
{   
    public function CreateApplicationTable()
    {
        global $present;
        exit(var_dump($present));
    }
}


$pdf = new ApplicationsPDF();
$pdf->CreateApplicationTable();
?>

Вывод null вместо «Hello World!».

Если я скопирую и вставлю этот код в один файл (который я запускаю прямо из браузера), он отлично работает!

Так что это должно быть ошибка CakePHP. Кто-нибудь это знает?


person ComFreek    schedule 30.03.2012    source источник
comment
Я не могу представить, чтобы такая значительная ошибка не была обнаружена раньше, но в журналах изменений 5.3.9+ ничего об этом нет. Я должен представить, что это что-то о вашей местной среде. Вы используете auto_prepend_file, чтобы что-то подправить?   -  person Alex Howansky    schedule 30.03.2012
comment
Нет, но приведенный выше код запускается из CakePHP 2.1.1. Я только что понял, что код отлично работает автономно. Я отредактирую вопрос. (Я знаю, что Stackoverflow не является средством отслеживания ошибок, но я не хотел удалять этот вопрос)   -  person ComFreek    schedule 30.03.2012
comment
Я знаю, что это не главное, но почему вы думаете, что вам нужно использовать глобальные переменные? Почему бы не передать $present в конструктор и не установить переменную класса?   -  person Wesley Murch    schedule 30.03.2012
comment
@Madmartigan Ты совершенно прав! Я уже хотел его рефакторить, но потом нашел этот баг ;)   -  person ComFreek    schedule 30.03.2012
comment
Да, код, размещенный выше, является моим полным файлом просмотра (после сокращения кода до ошибки).   -  person ComFreek    schedule 30.03.2012


Ответы (2)


Попробуйте объявить ключевое слово global перед определением класса:

global $present;

class ApplicationsPDF
{   
    public function CreateApplicationTable()
    {
        exit(var_dump($present));
    }
}
person Daniel Ribeiro    schedule 30.03.2012
comment
Это не работает и дает мне ошибку Undefined variable в CreateApplicationTable(). - person ComFreek; 30.03.2012
comment
Вы не удалили часть объявления переменной $present, не так ли? - person Daniel Ribeiro; 30.03.2012
comment
Я этого не сделал, но тогда $present никогда не будет определен (это не переменная представления). - person ComFreek; 30.03.2012

Это не ошибка PHP и не ошибка CakePHP!

Это потому, что CakePHP включает представление в свой класс представления, поэтому объявленные переменные на самом деле не находятся в глобальной области видимости, а global не имеет никакого эффекта.

Из ADmad (источник):

Когда вы запускаете файл сам по себе, ваше задание $testVar = 'Hello World!' находится в глобальном контексте, поэтому все работает так, как вы ожидали. Но когда он используется в качестве файла представления, файл включается в функцию класса View, поэтому он больше не находится в глобальном контексте, а $testVar больше не является глобальной переменной, поэтому ваше ожидание неверно. Использование глобальных переменных в рамках ООП в любом случае является плохой идеей.

person ComFreek    schedule 05.05.2012