왜 닫는 태그를 생략합니까?

PHP 닫기 태그를 사용하는 것은 좋지 않은 관행이라고 계속 읽습니다.?>파일 끝에 있습니다.헤더 문제는 다음 문맥에서는 무관하다고 생각됩니다(이것이 지금까지의 유일한 적절한 인수입니다).

최신 버전의 PHP는 output_buffering 플래그를 php.ini에 설정합니다.출력 버퍼링이 활성화되어 있는 경우 반환된 코드가 브라우저로 즉시 전송되지 않으므로 HTML 출력 후 HTTP 헤더 및 쿠키를 설정할 수 있습니다.

모든 모범 사례서와 위키에서는 이 ‘규칙’으로 시작하지만 아무도 좋은 이유를 제시하지 않는다.PHP 태그의 엔딩을 생략하는 다른 타당한 이유가 있습니까?



질문에 대한 답변



일반 과정보다 빨리 헤더를 전송하면 상당한 영향을 미칠 수 있습니다.다음은 그 중 몇 가지에 불과합니다.

  1. 현재의 PHP 릴리스에서는 출력 버퍼링이 설정되어 있을 가능성이 있습니다만, 코드를 전개하는 실제 실가동 서버는 개발이나 테스트 머신보다 훨씬 중요합니다.또, 항상 최신의 PHP 트렌드를 곧바로 추종하는 것은 아닙니다.

  2. 설명할 수 없는 기능 상실로 인해 두통이 생길 수 있습니다.예를 들어, 어떤 종류의 결제 게이트웨이를 구현하고 있으며, 결제 프로세서에 의해 정상적으로 확인된 후 사용자를 특정 URL로 리디렉션한다고 가정합니다.PHP 오류, 경고 또는 초과 행 종료가 발생하면 결제가 처리되지 않고 사용자가 청구되지 않은 것처럼 보일 수 있습니다.이는 불필요한 리다이렉션이 유해한 이유 중 하나이며 리다이렉션을 사용하는 경우에는 신중하게 사용해야 합니다.

  3. 최신 버전에서도 Internet Explorer에서 “페이지 로드 취소됨” 유형의 오류가 발생할 수 있습니다.왜냐하면 AJAX response/json include는 며칠 전에 접한 것처럼 일부 PHP 파일의 행 끝 부분이 너무 많기 때문에 포함해서는 안 되는 것을 포함하고 있기 때문입니다.

  4. 앱에 파일 다운로드가 있으면 파일 다운로드도 중단될 수 있습니다.다운로드의 구체적인 중단 습관은 서버, 브라우저, 파일의 종류와 내용에 따라 다르기 때문에 몇 년이 지나도 눈치채지 못할 수도 있습니다.

  5. 마지막으로 Symfony, Zend 및 Larabel을 포함한 많은 PHP 프레임워크(부호화 가이드라인에는 이에 대한 언급은 없지만 그에 준거한다)와 PSR-2 표준(항목 2.2)에서는 클로징 태그를 생략할 필요가 있습니다.PHP 매뉴얼(1,2), WordPress, Drupal 및 다른 많은 PHP 소프트웨어도 그렇게 하도록 조언합니다.표준(및 코드의 PHP-CS-Fixer 설정)을 따르는 습관을 들이면 이 문제를 잊어버릴 수 있습니다.그렇지 않으면 이 문제를 항상 염두에 두어야 합니다.

보너스: 다음 2개의 캐릭터와 관련된 몇 개의 gotcha(실제로 현재 1개)

  1. 일부 잘 알려진 라이브러리에서도 다음 시간 이후에 행이 과도하게 끝날 수 있습니다.?>예를 들어 Smarty는 2.* 브랜치와 3.* 브랜치의 최신 버전에서도 마찬가지입니다.따라서 항상 그렇듯이 서드파티 코드를 확인합니다.보너스:불필요한 PHP 엔딩을 삭제하기 위한 regex: 치환(s*?>s*)$PHP 코드가 포함된 모든 파일에 빈 텍스트가 포함되어 있습니다.



php 클로징태그를 떼야 하는 이유(?>)는 프로그래머가 실수로 추가 줄 바꿈 문자를 보내지 않도록 하기 위한 것입니다.

php closing 태그를 해제하지 않는 이유는 php 태그가 불균형을 일으키기 때문에 반쪽짜리 프로그래머라면 공백 공간을 추가하지 않는 것을 기억할 수 있기 때문입니다.

그럼 질문해 주세요.

엔딩 php 태그를 건너뛰는 다른 타당한 이유가 있나요?

아니요, php 태그의 끝을 생략할 다른 좋은 이유는 없습니다.

클로징 태그를 사용하지 않는 것에 대한 몇 가지 주장으로 마치겠습니다.

  1. 사람들은 아무리 똑똑해도 항상 실수를 할 수 있다.발생할 수 있는 실수를 줄이는 관행을 고수하는 것은 (IMHO) 좋은 생각입니다.

  2. PHP는 XML이 아닙니다. PHP는 XML의 엄격한 표준을 준수할 필요가 없습니다.만약 사라진 닫힘 태그가 거슬린다면 닫힘 태그를 사용할 수 있습니다. 어떤 식으로든 정해진 규칙이 아닙니다.




신참 코딩 스타일 추천으로, 선의로 매뉴얼에 따라 조언합니다.

  • 에슈잉?>단, 이미 송신된 일반적인 헤더(원시 출력, BOM, 통지 등)와 그 후속 조치 문제 중 몇 가지만 해결합니다.

  • PHP에는 실제로 다음 줄 바꿈을 소비하는 마법이 포함되어 있습니다.?>클로징 토큰비록 그것이 역사적인 문제를 가지고 있고, 새로운 사람들은 여전히 편집자들의 비난과 그 이후 다른 공백 공간에서 무의식적으로 뒤섞이기 쉽게 만든다.?>.

  • 스타일리시하게 일부 개발자는 보기 선호<?php그리고.?>SGML 태그/XML 처리 명령으로 후행 닫힘 토큰의 균형 정합성을 암시합니다(BTW는 비효율적인 파일별 자동 로딩을 대체하는 종속성 결합 클래스에 유용합니다).

  • 다소 이례적인 오프닝<?php는 PHP shebang(및 binfmt_misc 단위로 완전히 실현 가능)으로 특징지어지기 때문에 대응하는 클로즈 태그의 용장성을 검증합니다.

  • 기존 PHP 구문 가이드 사이에 명백한 조언 불일치가 있습니다.?>n그리고 더 최근의 것(PSR-2)은 누락에 동의했다.
    (공개를 위해 Zend Framework는 하나의 것을 다른 것으로 가정한다고 해서 본래의 우수성을 의미하는 것은 아닙니다.전문가가 다루기 어려운 API의 대상자를 파악했다는 것은 잘못된 생각입니다.

  • SCM과 최신 IDE는 대부분의 경우 태그 관리를 용이하게 하는 임베디드 솔루션을 제공합니다.

의 사용을 권장하지 않음?>close tag는 기본적인 PHP 처리 동작과 언어 의미에 대해 설명하는 것을 지연시킬 뿐입니다.참가자의 숙련도 차이로 인해 협업 소프트웨어 개발에 여전히 실용적입니다.

태그 변형 닫기

  • 일반 닫기 태그는 또는 “닫기 토큰”이라고도 합니다.

  • PHP의 매직뉴라인 eating으로 인해 몇 가지 더 구체화 되어 있습니다.

    ?>n (유닉스 라인 피드)

    ?>r (캐리지 리턴, 클래식 MAC)

    ?>rn (CR/LF, DOS/Win)

    그러나 PHP는 Unicode 콤보 줄 바꿈(U+0085)을 지원하지 않습니다.

    초기 PHP 버전에는 IIRC 컴파일이 포함되어 있어 플랫폼 부정성을 다소 제한하고 있습니다(FI는 단지 사용했을 뿐입니다).>클로즈 태그의 역사적 기원일 가능성이 있는 클로즈 태그)입니다.

  • 종종 간과되지만, PHP7에서 삭제될 때까지 일반 오프닝 토큰은 홀수 클로징 토큰으로 거의 사용되지 않는 토큰과 유효하게 페어링될 수 있습니다.

  • 하드 클로즈 태그”는 심지어 하나가 아닙니다. 단지 유추하기 위해 만든 용어입니다.단, 개념적으로나 사용방법에 따라서는 근접 토큰으로 인식해야 합니다.

    __HALT_COMPILER(); ?> 

    그 후 기본적으로 토큰화자는 코드 또는 플레인 HTML 섹션을 폐기합니다.특히 PAR 스터브에서는, 그 또는 그 용장성을 사용하고 있습니다.?>그림과 같이

  • 마찬가지로 include 스크립트에서 void가 자주 대체되지 않으며,?>후행 공백은 효과적이지 않습니다.

  • 다음으로 모든 종류의 소프트/가짜 클로즈 태그가 있습니다.알려지지 않고 거의 사용되지 않지만 보통 코멘트 아웃된 토큰에 따라 달라집니다.

    • PHP 토큰라이저에 의한 탐지를 회피하기 위한 단순한 간격입니다.

    • 또는 정규 표현으로 파악할 수 있는 화려한 Unicode 대체물(U+FE56 작은 물음표, U+FE65 작은 앵글 괄호)을 사용할 수 있습니다.

    다 PHP에는 아무런 의미가 없지만 PHP 비웨어 또는 반인식 외부 툴킷에 실용적으로 사용할 수 있습니다.다시.cat– 스크립트가 생각나며, 그 결과// ? > <?php이전 파일 섹션을 인라인으로 변환하는 연결입니다.

따라서 상황에 따라 다르지만 필수적인 근접 태그 누락에 대한 현실적인 대안이 있습니다.

수동 베이비시터?>어느 쪽이든 근접 태그는 매우 현대적이지 않습니다.이를 위한 자동화 툴은 항상 존재해 왔습니다(sed/awk 또는 regex-oneliner만 사용해도 마찬가지).특히:

phptags 태그 티디어

https://fossil.include-once.org/phptags/

이 방법은 일반적으로--unclosephp 태그(서드파티 코드용) 또는 실제 공백/B를 모두 수정합니다.OM 문제:

  • phptags --warn --whitespace *.php

처리도 가능합니다.--long런타임/구성 호환성을 위해 태그 변환 등을 수행합니다.




태그가 아니라…

하지만 만약 당신이 그것을 가지고 있다면, 그 뒤에 빈 공간이 생길 위험이 있습니다.

그런 다음 문서 맨 위에 포함으로 사용하면 HTTP 헤더를 보내기 전에 공백(예: 내용)을 삽입할 수 있습니다. 이는 허용되지 않습니다.




문서에 따르면 다음과 같은 이유로 파일 끝에 있는 경우 닫힘 태그를 생략하는 것이 좋습니다.

파일이 순수한 PHP 코드일 경우 파일 끝에 있는 PHP 닫힘 태그를 생략하는 것이 좋습니다.이로 인해 PHP 클로징 태그 뒤에 실수로 공백이 생기거나 새로운 행이 추가되는 것을 방지할 수 있습니다.이는 스크립트에서 프로그래머가 출력을 보낼 의도가 없을 때 PHP가 출력 버퍼링을 시작하기 때문입니다.

[ PHP Manual ]> [ Language Reference ]> [ Basic 구문 ]> [ PHP 태그]