왜 닫는 태그를 생략합니까?
PHP 닫기 태그를 사용하는 것은 좋지 않은 관행이라고 계속 읽습니다.?>
파일 끝에 있습니다.헤더 문제는 다음 문맥에서는 무관하다고 생각됩니다(이것이 지금까지의 유일한 적절한 인수입니다).
최신 버전의 PHP는 output_buffering 플래그를 php.ini에 설정합니다.출력 버퍼링이 활성화되어 있는 경우 반환된 코드가 브라우저로 즉시 전송되지 않으므로 HTML 출력 후 HTTP 헤더 및 쿠키를 설정할 수 있습니다.
모든 모범 사례서와 위키에서는 이 '규칙'으로 시작하지만 아무도 좋은 이유를 제시하지 않는다.PHP 태그의 엔딩을 생략하는 다른 타당한 이유가 있습니까?
일반 과정보다 빨리 헤더를 전송하면 상당한 영향을 미칠 수 있습니다.다음은 그 중 몇 가지에 불과합니다.
현재의 PHP 릴리스에서는 출력 버퍼링이 설정되어 있을 가능성이 있습니다만, 코드를 전개하는 실제 실가동 서버는 개발이나 테스트 머신보다 훨씬 중요합니다.또, 항상 최신의 PHP 트렌드를 곧바로 추종하는 것은 아닙니다.
설명할 수 없는 기능 상실로 인해 두통이 생길 수 있습니다.예를 들어, 어떤 종류의 결제 게이트웨이를 구현하고 있으며, 결제 프로세서에 의해 정상적으로 확인된 후 사용자를 특정 URL로 리디렉션한다고 가정합니다.PHP 오류, 경고 또는 초과 행 종료가 발생하면 결제가 처리되지 않고 사용자가 청구되지 않은 것처럼 보일 수 있습니다.이는 불필요한 리다이렉션이 유해한 이유 중 하나이며 리다이렉션을 사용하는 경우에는 신중하게 사용해야 합니다.
최신 버전에서도 Internet Explorer에서 "페이지 로드 취소됨" 유형의 오류가 발생할 수 있습니다.왜냐하면 AJAX response/json include는 며칠 전에 접한 것처럼 일부 PHP 파일의 행 끝 부분이 너무 많기 때문에 포함해서는 안 되는 것을 포함하고 있기 때문입니다.
앱에 파일 다운로드가 있으면 파일 다운로드도 중단될 수 있습니다.다운로드의 구체적인 중단 습관은 서버, 브라우저, 파일의 종류와 내용에 따라 다르기 때문에 몇 년이 지나도 눈치채지 못할 수도 있습니다.
마지막으로 Symfony, Zend 및 Larabel을 포함한 많은 PHP 프레임워크(부호화 가이드라인에는 이에 대한 언급은 없지만 그에 준거한다)와 PSR-2 표준(항목 2.2)에서는 클로징 태그를 생략할 필요가 있습니다.PHP 매뉴얼(1,2), Wordpress, Drupal 및 다른 많은 PHP 소프트웨어도 그렇게 하도록 조언합니다.표준(및 코드의 PHP-CS-Fixer 설정)을 따르는 습관을 들이면 이 문제를 잊어버릴 수 있습니다.그렇지 않으면 이 문제를 항상 염두에 두어야 합니다.
보너스: 다음 2개의 캐릭터와 관련된 몇 개의 gotcha(실제로 현재 1개)
- 일부 잘 알려진 라이브러리에서도 다음 시간 이후에 행이 과도하게 끝날 수 있습니다.
?>
예를 들어 Smarty는 2.* 브랜치와 3.* 브랜치의 최신 버전에서도 마찬가지입니다.따라서 항상 그렇듯이 서드파티 코드를 확인합니다.보너스:불필요한 PHP 엔딩을 삭제하기 위한 regex: 치환(\s*\?>\s*)$
PHP 코드가 포함된 모든 파일에 빈 텍스트가 포함되어 있습니다.
php 클로징태그를 떼야 하는 이유(?>
)는 프로그래머가 실수로 추가 줄 바꿈 문자를 보내지 않도록 하기 위한 것입니다.
php closing 태그를 해제하지 않는 이유는 php 태그가 불균형을 일으키기 때문에 반쪽짜리 프로그래머라면 공백 공간을 추가하지 않는 것을 기억할 수 있기 때문입니다.
그럼 질문해 주세요.
엔딩 php 태그를 건너뛰는 다른 타당한 이유가 있나요?
아니요, php 태그의 끝을 생략할 다른 좋은 이유는 없습니다.
클로징 태그를 사용하지 않는 것에 대한 몇 가지 주장으로 마치겠습니다.
사람들은 아무리 똑똑해도 항상 실수를 할 수 있다.발생할 수 있는 실수를 줄이는 관행을 고수하는 것은 (IMHO) 좋은 생각입니다.
PHP는 XML이 아닙니다. PHP는 XML의 엄격한 표준을 준수할 필요가 없습니다.만약 사라진 닫힘 태그가 거슬린다면 닫힘 태그를 사용할 수 있습니다. 어떤 식으로든 정해진 규칙이 아닙니다.
신참 코딩 스타일 추천으로, 선의로 매뉴얼에 따라 조언합니다.
에슈잉
?>
단, 이미 송신된 일반적인 헤더(원시 출력, BOM, 통지 등)와 그 후속 조치 문제 중 몇 가지만 해결합니다.PHP에는 실제로 다음 줄 바꿈을 소비하는 마법이 포함되어 있습니다.
?>
클로징 토큰비록 그것이 역사적인 문제를 가지고 있고, 새로운 사람들은 여전히 편집자들의 비난과 그 이후 다른 공백 공간에서 무의식적으로 뒤섞이기 쉽게 만든다.?>
.스타일리시하게 일부 개발자는 보기 선호
<?php
그리고.?>
SGML 태그/XML 처리 명령으로 후행 닫힘 토큰의 균형 정합성을 암시합니다(BTW는 비효율적인 파일별 자동 로딩을 대체하는 종속성 결합 클래스에 유용합니다).다소 이례적인 오프닝
<?php
는 PHP shebang(및 binfmt_misc 단위로 완전히 실현 가능)으로 특징지어지기 때문에 대응하는 클로즈 태그의 용장성을 검증합니다.기존 PHP 구문 가이드 사이에 명백한 조언 불일치가 있습니다.
?>\n
그리고 더 최근의 것(PSR-2)은 누락에 동의했다.
(공개를 위해 Zend Framework는 하나의 것을 다른 것으로 가정한다고 해서 본래의 우수성을 의미하는 것은 아닙니다.전문가가 다루기 어려운 API의 대상자를 파악했다는 것은 잘못된 생각입니다.
의 사용을 권장하지 않음?>
close tag는 기본적인 PHP 처리 동작과 언어 의미에 대해 설명하는 것을 지연시킬 뿐입니다.참가자의 숙련도 차이로 인해 협업 소프트웨어 개발에 여전히 실용적입니다.
태그 변형 닫기
일반 닫기 태그는 또는 "닫기 토큰"이라고도 합니다.
PHP의 매직뉴라인 eating으로 인해 몇 가지 더 구체화 되어 있습니다.
?>\n (유닉스 라인 피드)
?>\r (캐리지 리턴, 클래식 MAC)
?>\r\n (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/
이 방법은 일반적으로--unclose
php 태그(서드파티 코드용) 또는 실제 공백/B를 모두 수정합니다.OM 문제:
phptags --warn --whitespace *.php
처리도 가능합니다.--long
런타임/구성 호환성을 위해 태그 변환 등을 수행합니다.
태그가 아니라...
하지만 만약 당신이 그것을 가지고 있다면, 그 뒤에 빈 공간이 생길 위험이 있습니다.
그런 다음 문서 맨 위에 포함으로 사용하면 HTTP 헤더를 보내기 전에 공백(예: 내용)을 삽입할 수 있습니다. 이는 허용되지 않습니다.
문서에 따르면 다음과 같은 이유로 파일 끝에 있는 경우 닫힘 태그를 생략하는 것이 좋습니다.
파일이 순수한 PHP 코드일 경우 파일 끝에 있는 PHP 닫힘 태그를 생략하는 것이 좋습니다.이로 인해 PHP 클로징 태그 뒤에 실수로 공백이 생기거나 새로운 행이 추가되는 것을 방지할 수 있습니다.이는 스크립트에서 프로그래머가 출력을 보낼 의도가 없을 때 PHP가 출력 버퍼링을 시작하기 때문입니다.
[ PHP Manual ]> [ Language Reference ]> [ Basic 구문 ]> [ PHP 태그]
마감을 하지 않는 것이 꽤 유용하다.?>
인스톨.
파일은 PHP(구문 오류가 아님)에 유효하며, @David Dorward가 말한 것처럼 공백/브레이크 라인(브라우저에 헤더를 보낼 수 있는 모든 것)을 피할 수 있습니다.?>
.
예를들면,
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10);
imagepng ( $img);
?>
[space here]
[break line here]
무효가 됩니다.
그렇지만
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10 );
imagepng ( $img );
할 것이다.
이번만은 안전하기 위해 게을러야 한다.
이유는 알지만 보여줄 수 없어요
PHP 코드만 포함된 파일의 경우 닫기 태그(
?>
)는 절대 허용되지 않습니다.이것은 PHP에서 필요하지 않으며 생략하면 응답에 실수로 후행 공백이 삽입되는 것을 방지합니다.
출처 : http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
음, 두 가지 관점에서 바라볼 수 있습니다.
- PHP 코드는 XML 처리 명령의 집합에 불과하며, 따라서 PHP 코드와
.php
확장자는 우연히 PHP 코드에 대해 구문 분석되는 XML 파일에 지나지 않습니다. - PHP는 오픈태그와 클로즈태그의 XML 처리 명령 포맷을 공유하게 되었습니다.이를 바탕으로 파일에는
.php
확장자는 유효한 XML 파일일 수 있지만 그럴 필요는 없습니다.
첫 번째 루트를 믿는다면 모든 PHP 파일에는 종료 태그가 필요합니다.이러한 파일을 생략하면 비활성 XML 파일이 생성됩니다.그리고 다시, 빈자리가 없이<?xml version="1.0" charset="latin-1" ?>
선언입니다. 올바른 XML 파일이 없습니다.그러니까 큰 문제는 아니고...
두 번째 루트를 믿으시면 두 가지 유형의 루트가 열릴 겁니다.php
파일:
- 코드만 포함된 파일(예: 라이브러리 파일)
- 네이티브 XML 및 코드를 포함하는 파일(템플릿 파일 등)
그에 따라 코드 전용 파일은 종료하지 않고 종료할 수 있습니다.?>
그러나 XML 코드 파일이 닫히지 않고 끝나는 것은 좋지 않습니다.?>
XML이 무효가 되기 때문입니다.
하지만 당신이 무슨 생각을 하는지 알아요.PHP 파일을 직접 렌더링하는 일은 없기 때문에 XML이 유효한지 어떤지는 중요하지 않습니다.템플릿을 디자인하는 것은 중요합니다.XML/HTML이 유효한 경우 일반 브라우저에서는 PHP 코드가 표시되지 않습니다(코멘트처럼 처리됩니다).따라서 PHP 코드를 실행할 필요 없이 템플릿을 모델링할 수 있습니다.
난 이게 중요하다고 말하는 게 아니야.자주 표현되지 않는 광경일 뿐인데, 그 광경을 공유하기에 더 좋은 장소는?
개인적으로 라이브러리 파일에서는 태그를 닫지 않지만 템플릿 파일에서는 닫는다...어려운 일보다 개인적인 취향(및 코딩 가이드라인)이라고 생각합니다.
이미 언급한 모든 것 외에 디버깅해야 하는 큰 골칫거리였던 또 다른 이유를 제시하겠습니다.
PHP 5.4를 탑재한 Apache 2.4.6은 마감 뒤에 빈 공간이 있는 경우 실제로 프로덕션 머신에 세그멘테이션 장애가 있습니다.php
꼬리표요 몇 시간이나 허비했더니 마침내 끈으로 버그를 좁혔어요
Apache에서 발생하는 오류는 다음과 같습니다.
[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)
"헤더 문제 말고도 php 태그의 끝을 건너뛰는 다른 타당한 이유가 있나요?"
바이너리 출력, CSV 데이터 또는 기타 비HTML 출력을 생성할 때 불필요한 공백 문자를 실수로 출력하지 않도록 해야 합니다.
장점
- 열려 있는 태그를 닫는 것이 논리적인 방법입니다.다른 언어에서도 마찬가지입니다.X(HT) 뿐만 아니라ML 태그, 그리고 물결 괄호, 대괄호...
- 초보자도 헷갈리지 않습니다.
단점
- header() 함수 동작을 방해하기 때문에 닫는 태그 뒤에 실수로 공백 공간을 추가하는 문제를 방지합니다.일부 에디터 또는 FTP 클라이언트/서버는 파일 끝을 자동으로 변경하는 것으로 알려져 있습니다(적어도 기본 구성입니다).
- PHP 매뉴얼에 따르면 태그 닫기는 옵션이며 Zend는 이를 금지하고 있습니다.
결론
태그를 생략하는 것에 찬성하는 논거가 강해 보입니다(header() + PHP/Zend "권장"으로 큰 골칫거리를 피하는 데 도움이 됩니다).구문의 일관성에 있어서, 이것이 지금까지 본 것 중 가장 「아름다운」솔루션이라고는 말할 수 없습니다만, 이보다 더 좋은 것은 무엇일까요?
이 질문의 중복으로 표시되어 있기 때문에, 클로징 태그를 생략하지 않는 이유를 투고해도 좋다고 생각합니다.?>
원하는 이유가 있을 수 있습니다.
- 완전한 처리 명령 구문 포함(
<?php ... ?>
) PHP 소스는 유효한 SGML 문서이며, SGML 파서로 문제없이 해석 및 처리할 수 있습니다.추가 제한이 있으면 유효한 XML/XHTML이 될 수도 있습니다.
Nothing prevents you from writing valid XML/HTML/SGML code. PHP documentation is aware of this. Excerpt:
Note: Also note that if you are embedding PHP within XML or XHTML you will need to use the < ?php ?> tags to remain compliant with standards.
Of course PHP syntax is not strict SGML/XML/HTML and you create a document, which is not SGML/XML/HTML, just like you can turn HTML into XHTML to be XML compliant or not.
At some point you may want to concatenate sources. This will be not as easy as simply doing
cat source1.php source2.php
if you have inconsistency introduced by omitting closing?>
tags.Without
?>
it's harder to tell if document was left in PHP escape mode or PHP ignore mode (PI tag<?php
may have been opened or not). Life is easier if you consistently leave your documents in PHP ignore mode. It's just like work with well formatted HTML documents compared to documents with unclosed, badly nested tags etc.It seems that some editors like Dreamweaver may have problems with PI left open [1].
If I understand the question correctly, it has to do with output buffering and the affect this might have on closing/ending tags. I am not sure that is an entirely valid question. The problem is that the output buffer does not mean all content is held in memory before sending it out to the client. It means some of the content is.
The programmer can purposely flush the buffer, or the output buffer so does the output buffer option in PHP really change how the closing tag affects coding? I would argue that it does not.
And maybe that is why most of the answers went back to personal style and syntax.
There are 2 possible use of php code:
- PHP code such as class definition or function definition
- Use PHP as a template language (i.e. in views)
in case 1. the closing tag is totally unusefull, also I would like to see just 1 (one) php open tag and NO (zero) closing tag in such a case. This is a good practice as it make code clean and separate logic from presentation. For presentation case (2.) some found it is natural to close all tags (even the PHP-processed ones), that leads to confution, as the PHP has in fact 2 separate use case, that should not be mixed: logic/calculus and presentation
ReferenceURL : https://stackoverflow.com/questions/4410704/why-would-one-omit-the-close-tag
'programing' 카테고리의 다른 글
Eclipse 실행 시 기본 라이브러리를 재정의하지 않고 "java.library.path"에 추가하는 방법 (0) | 2022.09.19 |
---|---|
MySQL 오류 1241: 오퍼랜드에 1개의 열이 포함되어 있어야 합니다. (0) | 2022.09.19 |
foreach는 php의 배열 순서로 반복할 수 있습니까? (0) | 2022.09.19 |
어떻게 하면 발의 감지를 개선할 수 있을까요? (0) | 2022.09.19 |
휴지 상태, @SequenceGenerator 및 allocationSize (0) | 2022.09.18 |