2014-10-07 7 views
0

Zend2 MVC 프레임 워크에서 레거시 응용 프로그램을 래핑하려고합니다. Zend Skeleton Application 및 코드 샘플 (특히 https://github.com/maglnet/MaglLegacyApplication) 덕분에 대부분의 문제점을 해결했습니다.Zend 2 가져 오기 및 전역 네임 스페이스

나는 다음 "기존의"파일에 의해 설명되어 해결할 수되지 않은 하나의 큰 문제 :

<?php 
$test = "test"; 

function echo_test(){ 
     global $test; 
     echo "test = "; 
     var_dump($test); # Makes NULL explicit 
} 

echo_test(); 

ZF2 모듈에 대한 컨트롤러에서, 나는 등 사용의 출력을 캡처

... 
chdir($filePath) # Fixes relative includes 
ob_start(); 
include $filePathAndName; 
$output = ob_get_clean(); 
$response->setContent($output); 
return $response; 

을 ... 그리고 내가 다시 test = NULL를 얻을 : 출력 버퍼는 응답 객체로 그 스틱.

저는 ZF2 네임 스페이스가 레거시 파일에 문제를 일으킬 수 있고 그 이유를 분명히 알기 위해 노력했다고 경고했습니다. PHP 가이드, "Without any namespace definition, all class and function definitions are placed into the global space"에 따르면. 실제로, 나의 견본은이 진술 아래에 열거 된 것보다 약간 더 복잡합니다 ... 그러나 그것은 효과가없는 것처럼 보입니다.

나는 또한 "You can set a variable after declaring a namespace, but variables will always exist in the global scope. They are never bound to namespaces."을 봅니다.

나는 연구를 계속하고 마침내이 접근법이 "will import the contents of the include file into the method scope, not the class scope"임을 발견했습니다.

메서드 범위 밖에서 파일을 처리 할 수있는 방법이 있습니까?

답변

0

이것은 PHP 네임 스페이스와 관련이 없습니다. ZF 컨트롤러 동작 내에서 파일을 포함하는 경우 해당 함수의 가변 범위 내에서 파일이 실행됩니다. 예를 들어 작업하려면 파일을 포함시키기 전에 ZF 작업에서 global $test;을 선언해야합니다 (이는 끔찍할 것입니다).

기존 코드가 어떤 모양인지 정확히 알지 못하면 좋은 해결책을 제시하기가 어렵습니다. 당신이 일할 필요가있는 많은 수의 전역 변수가 있다면, ZF 응용 프로그램의 어떤 시점에서 전역화할 수 있습니다 (나중에 해당 해킹을 제거하겠다는 목표로). 전역 변수가 무엇인지 미리 알지 못하거나 많은 변수가있는 경우 전역에 의존하지 않도록 레거시 코드를 편집해야 할 수 있습니다.

+0

넵 (를 해결할 수 있음). 그것이 마침내 도달 한 동일한 결론입니다. 어느 시점에 전역 범위에서 액세스되는 거의 700 개의 고유 변수가 있습니다. 끔찍한 일이지만, grep, 중복 제거, 그리고 글로벌화가 빠릅니다. – claytond

0

또 다른 옵션은 (적어도 이론적으로) exec(), shell_exec(), passthru() (자동 출력을 인쇄)를 사용하는 것입니다, 또는 컬 (shell_exec 링크를 볼 수 있지만, 당신이 ZF2 외부에서 호스팅하는 경우에만 것은 무한 루프를 방지하기 위해). 특히 $ $ _POST 및