PHP에서 <? = 태그를 사용하는 것은 나쁜 습관입니까?


189

<?= ?>최근 에이 PHP 태그 를 발견했으며 사용하기를 꺼려하지만 너무 열심히 가려서 사용하고 싶습니다. 짧은 태그를 사용하는 것은 좋지 않으며 대신 <? ?>전체 태그 <?php ?>를 사용해야한다는 것을 알고 있습니다 <?= ?>.

일부 타이핑을 저장하고 코드 가독성, IMO에 더 좋습니다. 그래서 이것 대신에 :

<input name="someVar" value="<?php echo $someVar; ?>">

다음과 같이 쓸 수 있습니다.

<input name="someVar" value="<?= $someVar ?>">

이 연산자를 사용하는 것은 어리둥절합니까?


11
이런 종류의 질문에 대한 문제는 너무 의견이 많다는 것입니다. "기술적으로"는 옳고 그른 방법이 아닙니다. 어떤 사람들은 모든 선호도에 반대한다고 주장합니다. 결국 당신에게 달려 있습니다.
mseancole 2016 년

가능한 경우 모든 형식의 닫기 태그를 사용하지 마십시오. 즉, 파일에 PHP 코드 만 포함되어 있습니다 (html 없음). 닫는 태그가 있으면 그 뒤에 나오는 모든 문자가 브라우저 (웹 앱의 경우)로 출력되어 디버깅하기가 매우 어려울 수 있습니다. 자세한 내용 : stackoverflow.com/a/4453835/49560
dharm0us

비 소견 관련 : echoXSS 로의 연결이 매우 쉬우 므로주의하십시오 . 컨텍스트 전용 에코 방법 ( JS 컨텍스트 대신 a function html($x) { echo htmlentities($x,...); }및 un을 html($someVar);사용 echo $someVar하거나 사용) echo json_encode($x);을 사용 하는 것이 좋습니다 . 그러면 <?=변수 컨텐츠를 다른 곳에서 HTML 이스케이프 처리 했으므로 HTML 컨텍스트에서 에코되기 때문에 HTML이 이스케이프 처리되어야한다는 것을 다른 장소에서 마술처럼 알아야한다는 이유로 태그를 잘못 사용합니다.
Xenos

답변:


209

역사

잘못된 정보 열차가 역에서 너무 멀어지기 전에 PHP 짧은 태그에 대해 이해해야 할 것들이 많이 있습니다.

PHP의 짧은 태그의 주요 문제는 PHP <?가 다른 구문 인 XML 에 사용 된 태그 ( ) 를 선택할 수 있다는 것 입니다.

이 옵션을 사용하면 구문 오류없이 xml 선언을 원시 출력 할 수 없었습니다.

<?xml version="1.0" encoding="UTF-8" ?>

일반적인 XML 구문 분석 및 관리 방법을 고려할 때 큰 문제입니다.

무엇에 대해 <?=?

하지만 <?XML과 원인 충돌 <?= 하지 않습니다 . 불행히도, 켜고 끄는 옵션은에 묶여 short_open_tag있어 짧은 에코 태그 ( <?=) 의 이점을 얻으려면 짧은 열린 태그 ( <?) 의 문제를 처리해야했습니다 . 짧은 열린 태그와 관련된 문제는 짧은 에코 태그의 혜택보다 훨씬 더했다, 그래서 당신은 설정하는 만 반 권장 사항을 찾을 수 short_open_tag있는 당신은, 오프 해야한다 .

그러나 PHP 5.4에서는 짧은 에코 태그가 short_open_tag옵션 과 별도로 다시 활성화되었습니다 . 나는 이것 <?=자체에 근본적으로 아무런 문제가 없기 때문에 이것을 편의의 직접적인 승인으로 본다 .

문제는 <?=더 넓은 범위의 PHP 버전에서 작동 할 수있는 코드를 작성하려고한다면 보장 할 수 없다는 것 입니다.

알았어, 이제 그게 다 끝났어

사용해야합니까 <?=?

쇼트 에코 태그 사용 여부에 대한 순서도


70
나는 당신의 스냅 다이어그램에 동의하지 않습니다. 대부분의 프로덕션 환경이 짧은 태그를 사용하도록 구성 되었기 때문에 정답은 99.99 % 입니다. 당신을 가정 할 것은 불었다 그들은 제거 <?=방금 프로젝트 전체 검색을 수행 &의 교체에 상관없이 파일의 수천이 그것을 사용하는 방법, 이하 분에 고칠 수없는 미래에 <?=대한 <?php echo . 내 대답은 걱정하지 않고 그냥 사용 하면 이점이 결과보다 훨씬 중요합니다. <?=더 이상 짧은 태그로 간주되지 않습니다, Rasmus Lerdorf 자신도 매우 커밋했습니다.
dukeofgaming 2018 년

32
@dukeofgaming, 짧은 태그를 사용하도록 프로덕션 환경에 대한 데이터를 어디서 얻습니까? 그것들을 비활성화하는 것은 내가 들었던 가장 일반적으로 제안되는 구성 중 하나이며, 두 번째로 마법 따옴표를 비활성화하는 것입니다. 또한 프로덕션 환경과 다른 개발 환경을 갖는 것은 전혀 의미가 없습니다.
zzzzBov

4
짧은 태그는 기본적으로 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag 까지 활성화되었습니다 . 대부분의 호스팅 서비스는 아무런 문제없이 지원했으며 이것이 Kohana 프레임 워크의 이유 중 하나였습니다 격려하는 데 사용됩니다. <?=는 항상 켜져 있고 ( stackoverflow.com/a/6064813/156257 ) 대부분 켜져있었습니다. 다음과 같은 경우 호스트로 확인하여 오해 증명할 수 : 그들은 비활성화되고 PHP <5.3을 사용 하고 그들이 설정이 사용자 나 특별 요청에 따라 오버라이드 (override)하는 것을 허용하지 않는 경우; 이전의 모든 것이 거짓이면 반드시 걱정하십시오 <?=.
dukeofgaming 2018 년

6
당신은 <?=제거 될 것이라고 걱정하지 않으며 , 나도 마찬가지입니다. 다른 사람들도있을 수 있습니다 <?=. 어떤 사람들은 특정 언어 기능을 사용하는 것에 대한 비합리적인 두려움을 가지고 있습니다 ( php에서 태그를 닫지 않는 것과 같이 ).
zzzzBov 2016 년

8
바로 내 요점입니다. 걱정할 필요가 없습니다 . 난 그냥 "걱정하니?" --yes-> "계속해서 사용하면 걱정할 필요가 없습니다." 또한 태그를 닫지 않는 것이 나쁜 습관임을 암시하는 것처럼 느껴집니다.
dukeofgaming 2016 년

28

내 PHP 모자를 털어 내다

나는 <?= $someVar ?>더 장황한 echo(단순히 개인적인 취향) 이상의 사용을 선호합니다. 유일한 단점 AFAIK는 경우가있는 전 5.4.0을 실행하는 사용자를위한 것입니다 short_open_tag활성화해야합니다 php.ini 파일 .

이제 프로젝트가 OS가 아니라면 요점이라고 말합니다. 그렇다면 short_open_tag활성화해야 한다는 사실을 문서화 하거나 두 솔루션 중 더 이식성이 뛰어납니다.


1
Nitpick : PHP 5.4의 <?=영향을받지 않더라도 짧은 형식 태그를 사용하는 습관이 있다면 어떤 버전에서 지원되는 내용을 잊어 버리는 것은 매우 쉽습니다. short_open_tag<?
yannis

7
@YannisRizos <?=템플릿 스타일 사용을 위해 "지금 변수를 출력하고 있습니다"와 <?php"지금 많은 코드를 실행 하고 있습니다" 로 구별 하는 것이 좋습니다 . 내가 사용하지 않는 것이 좋을 것 <?, 그러나 둘 것을 <?=하고는 <?php정상입니다.
이즈 카타

2
Rasmus Lerdorf는 속기 <? = 태그를 보증하므로 +1입니다. 나는 PHP 5.4에 대한 그의 대화 중 하나를 보았습니다. 그렇기 때문에 PHP 5.4.0부터 <? = 태그를 항상 사용할 수 있습니다. <? = 태그는 MVC 응용 프로그램의보기에서 사용되지만 <? php ...?>는 비보기 파일에서 사용되는 PHP 5.4 이전의 많은 코드를 보았습니다.
프로그래머

@Jason 그게 내가 말하는 것이 아닙니다. "Rasmus는 foo를지지한다"는 주장 은 아니지만 "Rasmus는 이것과 그 이유 때문에 foo를지지한다"는 주장이다.
yannis 2016

2
@Yannis Rizos "Rasmus는 이것과 그 이유 때문에 foo를지지합니다". tutelage에 감사드립니다. 그러나 Rasmus Lerdorf가 언어를 만든 후에도 여전히 PHP 개발에 영향을 미치면서 Rasmus Lerdorf가 승인 한 이후로 <? = 태그를 항상 사용할 수 있도록 변경되었습니다. 이것이 원래 의견에 추가 한 것입니다. "따라서 뷰에서 <? =를 사용하는 관행은 아마도 더 널리 퍼질 것입니다." Dang, 나는 지금 내 의견을 세 번 확인해야 할 것이다 ... 점들 ...
프로그래머

21

당신은 확실히 그것의 여부, 짧은 형식의 태그를 피하려고한다 <?<?=.

주요 기술적 인 이유는 이식성이므로, 짧은 형식 태그는 모든 설정에 대해 작동한다고 확신 할 수 없습니다 short_open_tag. 꺼질 수 있으므로 지시문을 찾아보십시오. 그러나 긴 형식이 모든 곳에서 작동한다는 것을 항상 확신 할 수 있습니다.

일부 타이핑을 저장하고 코드 가독성, IMO에 더 좋습니다.

그것은 또한 나쁜 습관입니다. 나는 당신이 더 읽기 쉬운 것을 말할 수는 없지만 몇 가지 키 입력을 구하기위한 변명으로 코드 가독성을 사용하는 것에 대해 열심입니다. 가독성이 우려되는 경우 템플릿 엔진을 사용해야합니다.

<input name="someVar" value="{someVar}">

두 예제에서 훨씬 더 읽기 쉽습니다.

마지막으로 짧은 양식 태그는 주요 PHP 프로젝트 (예 : PEARZend Framework)에서 명시 적으로 권장하지 않습니다 .


14
템플릿의 경우 +1 이식성을 위해 -1입니다. 서버 측 언어입니다. 서버에 집중해야 할 과제는 확장 성 및 보안과 같은 것입니다. 여러 플랫폼에서 실행될 수 있도록 진지한 시간을 투자하는 것은 놀랍게도 나쁜 생각이 될 것입니다 ... (경우에 따라!) ...
riwalk

3
@ stargazer712 흠? 당신이해야 할 유일한 것은 표준 사용이다 <?phpecho대신을 <?하고 <?=당신은 심각한 시간을 계산합니까? 어떤 이유로 짧은 태그를 사용할 수없는 서버로 프로젝트를 이동하면 어떻게됩니까?
yannis 2016 년

13
@Yannis :이 문자 몇 개는 그리별로 보이지 않을 수도 있지만 IMO는 많은 노이즈를 발생시킵니다.
케빈 클라인

8
PHP의 원래 목적은 템플릿 언어 라는 것이 언급되어야한다고 생각합니다 . PHP 위에 다른 템플릿 엔진 (부풀림)을 추가해도 참치 보트가 뜨지 않습니다. HTML과 혼합 된 PHP를 코딩 할 때 모범 사례 (일부 유용한 팁은 여기 stackoverflow.com/questions/62617/… )를 따르십시오 .
프로그래머

2
@Yannis Rizos 그렇습니다. PHP를 처음 사용하는 사람들은 순수 PHP를 사용하지 않고 PHP 프로젝트에서 [whizbang] 템플릿 엔진을 사용해야한다고 생각할 수 있기 때문에 언급해야합니다. 내가 Perl로만 텍스트 처리를해야한다면 아닐 수도 있지만, 지금까지 Perl은 PHP 나 템플릿과 마찬가지로 텍스트 처리에 능숙하다고 생각합니다.
프로그래머

15

PHP-문서는 명확하게 짧은 에코 태그를 안전하게 사용할 수 있다고 말한다 :

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

이것은 PHP 버전 5.4 이상을위한 것이지만 모두 최소한이 버전을 사용해야합니다. 나는 템플릿 목적으로 만 선호합니다.


10

짧은 태그를 사용하는 이유 :

  • 그들은 더 짧습니다.

짧은 태그를 사용 하지 않는 이유 :

  • 그것들은 하나 이상의 구성 문제를 소개합니다-전문적인 상황에서 대부분의 시간 동안 서버를 제어하는 ​​동안 일반 대중에게 코드를 공개하려는 경우 공유 호스팅을 사용하는 사람들에게는 짧은 태그가 복구 불가능하게 깨질 수 있습니다 .
  • 비 위생 문자열을 출력에 자연스럽게 드롭하는 것이 너무 쉽습니다. XSS 취약점이 생길 수 있으므로 무섭습니다. 긴 태그는 이것을 막기 위해 직접적으로 아무것도하지 않지만, 프로그래머에게 그들이하고있는 일이 옳지 않다는 신호를 보내고, 현재 HTML 인코딩을 자동으로 처리하는 템플릿 시스템을 사용해야합니다 . 긴 태그로 동적 문자열을 출력하는 것은 고통 스럽습니다. 이는 좋은 (교육적인) 것입니다.

그것은 IMO를 받아들이는 대답이며, 템플릿조차도 모든 XSS를 안전하게 만들지는 못합니다 (스크립트의 src 속성의 사용자 데이터는 항상 안전하지 않습니다). PHP 변수가 스크립트 태그 내용으로 끝나면 어떻게해야합니까? HTML에 포함 된 SVG에서?
Xenos

@Xenos는 문제의 템플릿 시스템에 따라 다르며,은 총알이 없습니다. 그러나 대부분 버그 버그를 줄이고 수동 부지런함 (가장 중요한 단일 보안 버그 소스)이 필요한 시나리오의 수를 줄입니다. "동적 컨텐츠를 스크립트 태그에 넣지 마십시오"는 "모든 동적 컨텐츠가 모든 곳에 올바르게 HTML 인코딩되어 있는지 확인"하는 것보다 따르기 쉽고 감사하기 쉽습니다.
tdammers

4

<?=변수의 최종 출력에만 사용 하고 데이터 표시 와 직접 관련이없는 함수 호출 또는 삼항 논리를 피하는 경우 버전이 우수하고 수용 가능한 방법 이라고 생각합니다 .

그것은 <? echo($x); ?>어느 곳 보다 확실히 낫습니다 .

장기적으로 Smarty 와 같은 템플릿 엔진을 살펴볼 수 있습니다 .


3
스마티는 한때 템플릿 엔진,하지만 지금은 구식 & 비 대한 혼란, 그리고 당신은 정말 선택을 조종한다.
yannis 2016 년

2

PHP 7.4부터는 경기장이 약간 변경되었습니다.

<? ?> PHP 8.0에서는 공식적으로 사용되지 않으며 제거 될 예정입니다.

PHP RFC : PHP 지원 중단 오픈 태그<?= ?> 는 영향을받지 않는다고 명시 적으로 명시 합니다. 이것은 (RFC가 아닌 나에게 따르면) 사용이 권장되지 않음을 나타냅니다.


-3

솔직히 말해서, MVC가 이미 33 년을 축하하는 동안 방법이 구식이든 새로운 방식이든 결과를 반영하는 것은 꽤 쓸모없는 것이라고 생각합니다.

예, 이것은 들어오는 서버 (php) 데이터를 XML 문서 내에 캡슐화하여 응용 프로그램 / 클라이언트 계층에서 처리하는 것이 좋습니다. 따라서 그러한 태그를 사용하는 아이디어조차 절약 할 수 있습니다.


1
실제로 MVC는 33 년을 기념하며 1979 년 12 월 에이 백서 에서 처음으로 소개되었습니다 .
yannis 2016 년

그래, 난 여전히 2000 년에 내 실수 :-)
sebas

1
음 ... 템플릿 ... 템플릿과 MVC는 상호 배타적입니까?
Tim Seguine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.