Я пытаюсь обернуть унаследованное приложение в инфраструктуру Zend2 MVC. Благодаря Zend Skeleton Application и примеры кода (особенно https://github.com/maglnet/MaglLegacyApplication), Я решил большинство своих проблем.
Одна большая проблема, которую я не смог решить, иллюстрируется следующим «устаревшим» файлом:
<?php
$test = "test";
function echo_test(){
global $test;
echo "test = ";
var_dump($test); # Makes NULL explicit
}
echo_test();
В Контроллере для модуля ZF2 я фиксирую вывод include, используя выходной буфер, и вставляю его в объект ответа:
...
chdir($filePath) # Fixes relative includes
ob_start();
include $filePathAndName;
$output = ob_get_clean();
$response->setContent($output);
return $response;
… и я вернусь test = NULL
,
Я видел предупреждения о том, что пространства имен ZF2 могут создавать проблемы для устаревших файлов, и сделал все возможное, чтобы выяснить, почему. Согласно руководству PHP, «Без какого-либо определения пространства имен все определения классов и функций помещаются в глобальное пространство». В самом деле, мой пример только немного сложнее, чем тот, что указан ниже в этом утверждении … но, похоже, он не работает.
Я продолжил исследования и, наконец, обнаружил, что этот подход «импортирует содержимое включаемого файла в область видимости метода, а не в область класса».
Есть ли способ обработать файл за пределами области действия метода?
Это не имеет ничего общего с пространствами имен PHP. Если вы включаете файл из действия контроллера ZF, он будет выполняться в области видимости переменной этой функции. Чтобы ваш пример работал, вам нужно объявить global $test;
в действии ZF, прежде чем включать файл (что было бы ужасно).
Не зная точно, как выглядит ваш унаследованный код, сложно предложить хорошее решение. Если вам нужно работать с определенным числом глобалов, вы можете глобализировать их в какой-то момент раньше в приложении ZF (с целью устранения этого хака на более позднем этапе). Если вы заранее не знаете, что такое глобальные глобальные переменные, или если их много, возможно, вам придется отредактировать устаревший код, чтобы попытаться реорганизовать зависимость от глобальных глобальных переменных.
Другим вариантом (по крайней мере, теоретически) является использование Exec (), shell_exec (), пройти() (автоматически печатает вывод) или curl (см. ссылку на shell_exec, но только если вы размещаете его вне ZF2, чтобы избежать бесконечного цикла). Этот подход имеет свой список недостатков, в том числе: