2013-02-05 3 views
1

저는 FuelPHP 프레임 워크에 구축하고있는 웹 응용 프로그램이 있습니다. 내 서버가 PHP 5.3을 실행하는 동안 내 로컬 개발 환경에서 PHP 5.4가 실행 중입니다. 내 개발 환경에서 내 주요 템플릿 파일에서, 나는

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

이 요청 (연료 \ 코어 \ 요청 개체)에 대한 데이터의 무리에 결과를 모달 대화 상자로 덤프되는 수 있어요 나를 참조하십시오. 그러나 프로덕션 서버 (PHP 5.3)에서 똑같은 스크립트를 실행하려고하면 이전의 "ErrorException [오류] : 객체 컨텍스트에 없을 때 $ this를 사용합니다"

인스턴스화 된 객체와 정적으로 액세스되는 메소드의 차이점 내 질문은 PHP의 다른 버전이 다른 템플릿을 가진 동일한 템플릿 파일을 취급하는 이유는 무엇입니까? 아니면 두 환경의 명백하게 차이가있는 기능을 초래할 수있는 다른 구성 뉘앙스가 있습니까?

답변

1

정확함. 뷰는 샌드 박스처럼 작동하도록 설계된 클로저에 렌더링됩니다.

$이보기에서 작동하지 않아야하지만 PHP 5.4에서와 같이 호출 스택에서 더 높은 객체를 가져옵니다. 뷰 또는 컨트롤러가 아닌 요청을 제공하기 때문입니다. 어느 것이 이미 사용하는 것이 신뢰할 수 없다는 것을 나타냅니다. $ this는 콜 스택 (callstack)에 따라 달라집니다.

템플릿 엔진을 사용하지 않더라도 HTML을 생성하는 데 필요한 논리 외에보기에서 "논리"를 사용하는 것은 좋지 않은 방법입니다. 컨트롤러에서보기에 필요한 데이터를 전달하거나 Viewmodel을 사용하여 데이터를 준비하십시오.

+0

PHP 5.4에서 클로저 바인딩에 대한 추가 정보 : http://christophh.net/2011/10/26/closure-object-binding-in-php-54/ –

2

나는 FuelPHP를 모르지만 템플릿이 클로저 안에 포함 된 것처럼 보입니다. PHP 5.4 클로저는 객체에 바인딩 될 수 있고 $this을 가질 수 있기 때문에. 디폴트에서는 클로저가 작성된 오브젝트입니다. 또한 : https://stackoverflow.com/a/5734109/664108

관련 문제