Ответы Mail.ru: Почему,  в старой версии этот код срабатывает, а в новой нет

Строки для ключей и значений требовалось использовать всегда. Но при этом в языке существовала глюкофича, когда код:

 $student = array(
  'Name' => John,
  'Surname' => Smith,
  'Age' => 20
); 

выполнялся как:

 define('John', 'John'); 
define('Smith', 'Smith'); 
$student = array( 
  'Name' => John, 
  'Surname' => Smith, 
  'Age' => 20 
); 

Т.е. сначала автоматически создаются константы с идентичным именем и значением, а потом значения этих констант подставляются в выражения. Использование таких неэкранированных слов заметно замедляет PHP-код: нормальные строки интерпретатор PHP отрабатывает многократно быстрее.

Эта возможность всегда считалась говнокодом.

По версию 7.1 включительно твоя конструкция выбрасывает Notice (которые чаще всего отключены и внимания на них не обращают), в версиях 7.2-7.4 выбраcывается Warning, начиная с версии 8.0 - Fatal Error.

А ещё в современных версиях PHP тег <? по умолчанию отключен. Из всех тегов, которые когда-то были, в современном коде остались только <?php и <?=.

P.S. Включение показа Notice в PHP благотворно влияет на умение писать качественный код.