문제

방금 PHP 5.3으로 업그레이드하고 새로운 고객을위한 이전 웹 사이트를 지원하기 시작했습니다. 내가 전에 만나지 못한 다소 이상한 PHP 코드를 사용하는 것 같습니다.

$ _get 또는 $ _request 변수에 액세스하려고하는 동안 개발자는 다음을 사용했습니다. $ { "variable_name"}

정의되지 않은 변수로 인해 생성 된 통지를받습니다 (아마도 PHP가 구문 분석하지 않기 때문에 $ { "variable_name"} 스타일 코드).

이것을 변경합니다 $ _request [ 'variable_name' 예상대로 작동하지만 사이트가 방대하고 독점 레이아웃 방법을 사용하므로 모든 코드를 거쳐 변경할 수는 없습니다.

이 태그 / 코드 블록에 대한 지원을 켜는 것이 가능한지 아는 사람이 있습니까? 나는 php.ini를 살펴 보았고 ASP 스타일 태그와 짧은 태그에 대한 언급이 있지만 효과가 없다는 것은 효과가 없습니다 (어쨌든 완전히 다르게 보이면 샷의 가치가 있다고 생각했습니다).

도움이 되었습니까?

해결책

나는 그 구문에 새로운 것이 있다고 생각하지 않습니다.

$a = 10;
var_dump(${"a"});

잘 작동합니다 ;-)


당신은 아마도 이전에, 아마도 register_globals 활성화되었습니다 (기본적으로, php <= 4.something), 이제 비활성화되었습니다. 그리고 그것은 보안에 좋습니다!

register_globals가 켜져 있고 모든 변수가 설정되어 있습니다 $_REQUEST 응용 프로그램에서 자동으로 vartiable로 주입됩니다 - 실제로, 이것은에 달려 있습니다 variables_order 구성 옵션이지만 여기에는 거의 항상 Get, Post 및 Cookie가 포함됩니다.

예를 들어, 같은 변수가있는 경우 $_GET['my_var'], 당신은 또한 a $my_var 변수 ... 그리고 이것은 구문으로도 액세스 할 수 있습니다. ${'my_var'}


고려하면 register_globals ~이다 Off PHP 4.2와 같은 것이기 때문에 기본적으로 PHP 6에서 사라져야합니다. (내가 정확하게 기억한다면), 나는 그것을 다시 활성화하는 것에 대해 조언 할 것입니다 ... 적어도, 코드를 수정 / 테스트하는 데 필요한 시간이 있다면 ...

다른 팁

변수의 Curly Brace Syntax는 PHP의 내장 부분이며 잠시 동안 주변에있었습니다. 그것이 존재하는 이유는 사용시 배열 및 객체 구문으로 모호성을 해결하는 것입니다. 변수 변수.

매뉴얼에서 :

배열과 함께 가변 변수를 사용하려면 모호성 문제를 해결해야합니다. 즉, $$ a를 작성하는 경우입니다1 그런 다음 파서는 $ a를 사용 해야하는지 알아야합니다.1 변수로서 또는 $$ a를 변수로 원한다면 1 해당 변수에서 색인. 이 모호성을 해결하기위한 구문은 다음과 같습니다. $ {$ a1} 첫 번째 케이스 및 $ {$ a}1 두 번째.

배열 또는 객체 변수를 사용하면서 사용중인 것을 출력하는 등 여러 상황에서 매우 편리한 구문입니다. HEREDOC SYNTAX.

나는 다른 사람들이 사용하는 것에 대한 조언을 반복하지 않을 것입니다 register_globals, 나는이 특이한 구문에 대해 설명하고 싶었습니다.

$ { "variable_name"} 구문은 곱슬 버팀대의 내용이 먼저 평가된다는 점을 제외하고는 $ variable_name과 거의 동일합니다. 최신 버전의 PHP, 심지어 베타 버전에서 지원됩니다. 최근 버전의 PHP에서 지원되지 않는 것은 $ _request (및 기타) 변수를 전역 변수로 등록하는 지원입니다. 그것을 활성화하기위한 설정이 있습니다.

register_globals = on

그러나 보안 문제로 인해 생산 사용에는 권장되지 않습니다. 일부 'sed'도구를 통해 소스를 실행하는 것이 더 쉬울 수 있으며 사용법을 정규 표현으로 바꾸는 것이 더 쉬울 수 있습니다.

기존 서버는 아마도있을 것입니다 REGISTER_GLOBALS 에. 따라서 이상한 괄호는 문제가되지 않습니다.

REGISTER_GLOBALS 모든 변수를 넣습니다 $_REQUEST 글로벌 범위의 일반 변수로서 액세스 할 수 있습니다. $_REQUEST['test'] 처럼 액세스 할 수 있습니다 $test 또는 ${"test"}

브래킷 구문이 기본적으로 켜져 있으며, 켜거나 끄는 것을 믿지 않습니다.

register_globals 전원이 켜졌을 것입니다. {$variable_name} 구문은 항상 켜져 있지만 register_globals 같은 것들을 돌립니다 $_REQUEST['variable_name'] ~ 안으로 $variable_name.

그러나 가능한 경우 전환하지 마십시오. 오랫동안 권고 된 이유가 있으며 PHP6에서 완전히 사라지고 있습니다.

register_globals PHP 5.3 기준으로 더 이상 사용되지 않으며 PHP 6.0 기준으로 제거됩니다. 당신이하고 싶은 것은 대부분의 PHP IDE (Zendo Studio 6+)에서 발견 된 리팩토링 기능을 사용하여 변수의 이름을 더 적절한 것으로 바꾸는 것입니다. $_GET['variable_name'].

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top