닫기 태그를 생략하는 이유는 무엇입니까?


373

?>파일 끝에서 PHP 닫기 태그를 사용하는 것은 좋지 않습니다. 헤더 문제는 다음 컨텍스트와 관련이없는 것 같습니다 (지금까지는 유일한 좋은 주장입니다).

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

모든 모범 사례 책과 위키는이 '규칙'으로 시작하지만 아무도 좋은 이유는 없습니다. 끝나는 PHP 태그를 건너 뛰어야 할 또 다른 이유가 있습니까?


3
[일부 스크립트에서 닫기 PHP 태그를 생략하는 이유는 무엇입니까?>] ( stackoverflow.com/questions/3219383/… )
Gordon

@Christian-output_buffering을 사용하는 것이 게 으르거나 떠나는 것이 게으른 것을 의미 ?>합니까?
El Yobo

4
@ Gordon-그것이 dup이라고 생각하지 않습니다. OP는 확장 가능한 이유를 알고 있습니다. 출력 버퍼링으로 완전히 해결되는지 알고 싶습니다.
El Yobo

5
더 좋은 질문은 다음과 같습니다. 왜 닫기 태그를 포함합니까? 코드는 악하다. 가장 좋은 코드는 전혀 코드가 아닙니다. 코드로 해결하는 대신 문제를 제거 할 수 있으면 코드를 사용하는 것보다 낫습니다. 이 경우에는 해결해야 할 문제가 없습니다. 닫기 태그가 없으면 코드가 제대로 작동합니다.
still_dreaming_1

19
세상에, 이것은 탭 대 공간 거룩한 전쟁을위한 장소가 아닙니다. lol :)
Kevin Wheeler

답변:


321

일반 과정보다 일찍 헤더를 보내면 결과가 크게 달라질 수 있습니다. 다음은 현재 내 마음에 들었던 몇 가지 예입니다.

  1. 현재 PHP 릴리스에는 출력 버퍼링 이있을 수 있지만 코드를 배포 할 실제 프로덕션 서버 는 개발 또는 테스트 머신보다 훨씬 중요합니다. 그리고 항상 최신 PHP 트렌드를 따르는 경향이있는 것은 아닙니다.

  2. 설명 할 수없는 기능 손실로 인해 두통이 발생할 수 있습니다 . 일종의 결제 게이트웨이를 구현하고 있고 결제 프로세서가 확인한 후 사용자를 특정 URL로 리디렉션한다고 가정 해 보겠습니다. 어떤 종류의 PHP 오류, 경고 또는 초과 라인 종료가 발생하더라도 지불은 처리되지 않은 채 남아 있으며 사용자는 여전히 청구되지 않은 것처럼 보일 수 있습니다. 이것은 또한 불필요한 리디렉션이 악한 이유 중 하나이며 리디렉션을 사용해야하는 경우주의해서 사용해야합니다.

  3. Internet Explorer에서 심지어 최신 버전에서도 "페이지로드가 취소되었습니다"오류가 발생할 수 있습니다. 이것은 AJAX 응답 / json include에 며칠 전에 만난 것처럼 일부 PHP 파일의 초과 줄 끝 때문에 포함되어서는 안되는 내용이 포함되어 있기 때문입니다.

  4. 당신은 어떤이있는 경우 파일 다운로드 앱에서을, 그들은이 때문에도 끊을 수있다. 그리고 몇 년이 지난 후에도 다운로드의 특정 습관은 서버, 브라우저, 파일의 유형 및 내용에 달려 있기 때문에 눈치 채지 못할 수도 있습니다. .

  5. 마지막으로 Symfony , Zend 및 Laravel을 포함한 많은 PHP 프레임 워크 ( 코딩 가이드 라인 에 언급되지 않았지만 그 내용을 따른다)와 PSR-2 표준 (항목 2.2)에는 닫는 태그가 필요하지 않습니다. PHP 매뉴얼 자체 ( 1 , 2 ), Wordpress , Drupal 및 많은 다른 PHP 소프트웨어는 그렇게 생각합니다. 단순히 표준을 따르는 습관을 가지고 있다면 (그리고 코드에 PHP-CS-Fixer 를 설정 하면) 문제를 잊을 수 있습니다. 그렇지 않으면 항상 문제를 염두에 두어야합니다.

보너스 :이 두 캐릭터와 관련된 몇 가지 문제 (실제로 현재 하나) :

  1. 일부 잘 알려진 라이브러리도 이후에 줄 끝이 초과 될 수 있습니다 ?>. 예를 들어 Smarty이며, 최신 버전의 2. * 및 3. * 분기에도이 기능이 있습니다. 따라서 항상 그렇듯이 타사 코드를 조심하십시오 . 보너스 보너스 : 불필요한 PHP 엔딩을 삭제하기위한 정규식 : (\s*\?>\s*)$PHP 코드가 포함 된 모든 파일에서 빈 텍스트로 바꿉니다.

약간 다른 정규식 나는 찾기 위해, 넷빈즈 IDE로 태그를 찾을 수 및 대화 교체하는 데 사용 : \?>(?s:.){0,10}\Z 짧은 설명 : changeset.hr/blog/miscellaneous/catch-near-eof-with-regex
frnhr을

@Cek은 10 자 이하의 코드를 포함한 모든 텍스트를 포착합니다 ?>. 예를 들어 일치 ?> Hello하고 삭제 <?php echo "test"; ?> Hello합니다. 닫기 태그 만 지우고 싶습니다.
Halil Özgür

6
더구나, PHP 5.4가 설치된 아파치 2.4.6은 닫는 태그 뒤에 빈 공간이있을 때 실제로 프로덕션 시스템에서 결함을 세분화합니다. 나는 마침내 strace로 버그를 좁힐 때까지 몇 시간을 낭비했습니다. 아파치에서 발생하는 오류는 다음과 같습니다 [core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)..
Artem Russakovskii 5

3
@INTPnerd 아, 질문과 대부분의 답변은 헤더를 참조 하므로이 스레드를 읽는 사람은 누구나 그것에 대해 생각할 것이라고 생각했습니다. 여기서 많은 답변에서 근본적인 문제와 문제의 실제 원인은 공백이 필요하지 않으므로 ?>출력과 마찬가지로 헤더가 출력되는 즉시 헤더가 전송됩니다. "HTML 헤더"가 없습니다 (관련되지 않은 HTML5 <header>태그 이외 ).
Halil Özgür

2
전역 수정 자에 관계없이 작동합니다. \ s * \?> \ s * \ Z 끝에 '\ Z'가 표시됩니다. 파일 끝의 마지막 공백이 아닌 경우에만 PHP 닫기 태그를 캡처합니다.
Erutan409

122

PHP 닫기 태그 ( ?>)를 생략해야하는 이유 는 프로그래머가 실수로 줄 바꿈 문자를 추가로 보내지 않기 때문입니다.

PHP 닫기 태그를 생략해서는 안되는 이유는 PHP 태그에 불균형이 발생하고 절반의 마음을 가진 프로그래머는 공백을 추가하지 않는 것을 기억할 수 있기 때문입니다.

그래서 당신의 질문에 대해 :

종료 PHP 태그를 건너 뛸 또 다른 이유가 있습니까?

아니요, 끝나는 php 태그를 건너 뛸 다른 이유 가 없습니다 .

닫는 태그를 방해하지 않는 몇 가지 주장으로 마무리하겠습니다.

  1. 사람들은 아무리 똑똑해도 항상 실수를 할 수 있습니다. 가능한 실수의 수를 줄이는 관행을 따르는 것이 (IMHO) 좋은 생각입니다.

  2. PHP는 XML이 아닙니다. PHP는 잘 작성되고 기능하기 위해 XML의 엄격한 표준을 준수 할 필요가 없습니다. 결산 태그가 누락되어 성가신 경우 결산 태그를 사용할 수 있습니다.


2
> 마음이 반한 프로그래머라면 공백을 추가하지 않아도됩니다. 더 좋은 점은 1/2 마음을 가진 개발자라면 SVC에 사전 커밋 후크를 추가하여 후행 공백이 자동으로 삭제되도록하는 것입니다.
BryanH

6
@BryanH, 후행 공백이 절대적으로 필요한 파일이있을 때까지는 매우 드 very니다 .
zzzzBov

1
물론 그렇습니다. 매우 멋진 대안에 대한 마리오의 답변 을 확인하십시오 .
BryanH

""php 닫는 태그를 없애지 말아야하는 이유는 php 태그에 불균형을 일으키고 절반의 마음을 가진 프로그래머라면 공백을 추가하지 않는 것을 기억할 수 있기 때문입니다. " 아마도 Windows에서. UNIX 계열 시스템에서는 모든 파일이 \ n으로 끝나고 프로그램이 추가합니다. 편집 : 아하! 아래 @mario에서 언급했듯이 PHP는 실제로 그것을 먹습니다.
Andrea

2
더 중요한 것은 두 배의 마음을 가진 프로그래머조차도 인간이며 무언가를 잊어 버린다는 것입니다.
Sebastian Mach

57

그것은의 스타일 추천 코딩 초보자 , 선의, 그리고 조언 수동으로 .

  • 끊었 ?>그러나 단지 해결 물방울 공통의 이미 원인을 전송 헤더 (원시 출력, BOM ,주의 사항 등)과 그 후속 문제.

  • PHP는 실제로 ?>토큰을 닫은 후 단일 줄 바꿈을 먹는 마술을 포함 합니다. 비록 역사적 문제 가 있지만 , 새로운 이민자들은 여전히 ​​불완전한 편집자들에게 영향을 받고 후에 다른 여백에서 눈치 채지 못하고 떠난다 ?>.

  • 문체 일부 개발자는보기로 선호 <?php하고 ?>SGML로 태그 / XML 가까운 토큰 뒤의 균형 일관성을 암시 명령의 처리. btw 종속성 결합 클래스에 비효율적 인 파일 별 자동로드를 대체하는 데 유용 합니다.

  • 다소 드물게 오프닝 <?php은 PHP shebang ( binfmt_misc 당 완전히 실행 가능 )으로 특성화 되어 해당 닫기 태그의 중복성을 검증합니다.

  • 필수 PHP 구문 가이드?>\n 와 누락에 동의하는 최신 PHP 구문 가이드 (PSR-2) 사이에는 명백한 조언 불일치가 있습니다 .
    (기록을 위해 : 젠드 프레임 워크가 서로를 가정한다고해서 내재 된 우월성을 암시하는 것은 아닙니다. 전문가가 다루기 어려운 API의 잠재 고객을 이끌어 내거나 목표로 삼는 것은 오해입니다).

  • SCM 과 최신 IDE 밀접한 태그 관리를 완화 하는 기본 제공 솔루션을 제공합니다 .

?>close 태그 사용을 권장하지 않으면 기본적인 PHP 처리 동작 및 언어 의미를 설명하는 것을 지연시켜 드문 문제를 피할 수 있습니다. 그것은이다 실제 인해 참가자의 능력 변화에 협업 소프트웨어 개발을위한 계속.

유사 태그 유사

  • 일반 ?> 가까운 태그로도 알려져 있습니다 T_CLOSE_TAG, 또는 따라서 "가까운 토큰".

  • PHP의 마술 줄 바꿈 식으로 인해 몇 가지 화신이 더 있습니다 .

    ?>\n (유닉스 줄 바꿈)

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

    ?>\r\n (DOS / Win에서 CR / LF)

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

    초기 PHP 버전에는 플랫폼 인식을 제한하는 IIRC 컴파일 기능이 있었으며 (FI는 막힌 >마커로 도 사용됨 ), 이는 태그 근접 방지의 역사적 원인 일 가능성이 높습니다.

  • 종종 간과하지만 때까지 PHP7 그들을 제거 , 일반 <?php개방 토큰이 될 수 유효 드물게 사용되지와 쌍 </script>으로 홀수 폐쇄 토큰 .

  • " 하드 클로즈 태그 "는 하나도 아닙니다. 단지 그 용어를 유추로 만들었습니다. __halt_compiler그러나 개념적으로나 사용법 별로는 가까운 토큰으로 인식해야합니다.

    __HALT_COMPILER();
    ?>

    기본적으로 토크 나이 저는 이후에 코드 또는 일반 HTML 섹션을 삭제합니다. 특히 PHAR 스텁은이를 사용하거나 ?>그림 과 같이 중복 조합을 사용 합니다.

  • 마찬가지로 않는 무효가return; 자주에 대체 어떤 렌더링, 스크립트를 포함 ?>공백 noneffective 후행.

  • 그런 다음 모든 종류의 소프트 / 가짜 가까운 태그 변형이 있습니다. 덜 알려지고 거의 사용되지 않지만 일반적으로 주석 처리 된 토큰 당 :

    • // ? >PHPs 토크 나이저로 탐지를 회피하는 간단한 간격 .

    • 또는 // ﹖﹥정규 표현식을 파악할 수있는 멋진 유니 코드 대체품 (U + FE56 작은 질문 표시, U + FE65 작은 각도 브래킷).

    둘 다 PHP 에는 아무런 의미가 없지만 PHP를 인식하지 못하거나 반 인식 외부 툴킷에 실용적으로 사용할 수 있습니다. 다시 cat결합 된 스크립트 // ? > <?php는 이전 파일 섹션을 인라인으로 유지하는 연결 결과와 함께 떠 오릅니다 .

따라서 명령형 닫기 태그 생략에 대한 상황에 따라 다르지만 실용적인 대안이 있습니다.

?>가까운 태그를 수동으로 보모하는 것은 현대적이지 않습니다. sed / awk 또는 regex-oneliners조차도 항상 자동화 도구가 있습니다. 특히:

phptags 태그 tidier

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

일반적으로 --unclose타사 코드의 PHP 태그에 사용 되거나 실제 공백 및 BOM 문제를 해결할 수 있습니다.

  • phptags --warn --whitespace *.php

또한 --long런타임 / 구성 호환성을 위해 태그 변환 등을 처리합니다 .


7
그렇습니다. 시간이 지남에 따라 읽은 내용에서 처리 할 수없는 소프트웨어로 작업하지 않는 한 토큰을 닫는 것은 절대 단점이 아닙니다. 클로징 토큰을 생략하는 것이 나쁘고 멍청한 짓임을 실제로 증명할 수 없다면, 나의 downvote는 그대로 남아 있습니다;)
jpeltoniemi

2
@Pichan : 허용하겠습니다. 그러나 나는 당신이 여기서 말하는 것을 완전히 이해하지 못했다고 가정합니다. 피하고 피하는 것은 서로 다른 두 가지입니다. 그리고 반으로 해결 된 문제는 뱀 기름 조언의 결과입니다.
mario

6
@ 마리오 : 초보자 코딩 스타일 권장 사항 입니다. 동의하지 않습니다. 전체 Zend 프레임 워크는 닫기 태그를 생략합니다. 나는 그것이 매우 개인적인 선택이라고 생각합니다. 정말로 <? php를 열어두고 초보자를 느끼지 않는 것을 선호합니다 :)
Daniele Vrut

1
HTML은 어떻습니까? 그렇다면 필요합니까? exammple를 들어 <?php if($var): ?>Hello World<?php endif; ?>??? 나는 특별히 언급되지 않았기 때문에 진정으로 궁금합니다.
WASasquatch

1
@WASasquatch 예. HTML과 PHP 모드를 전환하는 경우 어떤 경우에도 가까운 토큰이 필요합니다. (실제로 원래 질문과는 관련이 없습니다.)
mario

22

태그가 아닙니다…

그러나 공백이 있으면 공백이 생길 위험이 있습니다.

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


10
태그가 아니면 무엇입니까?
danidacar

예를 들어 주시겠습니까? 어쩌면 내 PHP 설정이 whack 일 수도 있지만 문제를 재현 할 수 없습니다.
danidacar

2
file1.php : <?php $i = 1; ?> 그런 다음 file2.php :<?php include 'file1.php'; header('Location: http://www.google.com');?>
Quentin

1
출력 버퍼링에도 단점이 있습니다. 서버에서 더 많은 메모리를 사용합니다 (모든 출력은 출력 될 때까지 RAM에 저장해야하므로 버퍼링하지 않고 바로 진행됩니다). 또한 너무 느립니다. 이 중 어느 것도 문제가되지 않지만 어쨌든 게 으르므로 닫는 태그를 끄지 않는 이유는 무엇입니까? 나는 phpcs닫는 태그가 내 파일 중 하나 하나마다 남아 있는지 확인하고 출력 버퍼링에 대해 걱정하지 않습니다. :)
El Yobo

1
@danip : PHP 구성 파일에서 output_buffer 플래그를 설정 한 경우이 문제를 재현 할 수 없습니다.
Jichao

16

닫히지 않는 것이 ?>좋습니다.

이 파일은 구문 오류가 아닌 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 );

의지.

한 번, 당신은 안전하기 위해 게으른해야합니다 .


3
그래서 이탤릭체로 보안을 설정했습니다. 그것은 후 원치 않는 공간을 당신에게 많은 시간을 요할 수있는 오류에서 당신을 방지합니다 ?>. 여기에 보안 이 좋은 단어가 아닐 수도 있습니다. 어쨌든, 그것은 아무것도 고치지 않습니다 (사물을 막기 위해 나에게 나쁜 코드는 아니며, echo여기에 나쁜 코드가 있었을 것입니다) / 그리고 여전히 유효합니다. 이것에 대해 틀린 것을 증명하십시오.
시키 류

난 당신을 공감하지 않았어요 그러나 내 요점은 당신과 호환됩니다. 아무것도 고치지 않습니다. 나는 그것이 유효하지 않다고 말한 적이 없으므로 아무것도 증명할 필요가 없습니다.
Christian

1
Chouchenos, 나는 당신이 안전한 것이 아니라 안전한 것을 의미했습니다. 그것에 대한 부정은 너무 많았습니다. 당신을 다시 광장으로 데려 왔습니다. ;-) 당신은 결국 잘못된 말을하지 않았습니다. PHP 개발 지침조차도 그렇게하도록 권장합니다. 예를 들어 출력 버퍼링보다는 태그 생략에 의존하는 것이 훨씬 낫습니다. 후자는 display_errors를 off로 설정하는 것과 같습니다. 순수한 부정 행위. 그리고 앱이 이식성이 없을 가능성이 높습니다. 실제로 출력 버퍼링에 전혀 의존하지 않는 것이 좋습니다.
maraspin

1
?>PHP 전용 파일의 끝에 넣는 것을 좋아하는 사람들에게 질문하고 싶지 않습니다 . 그러나 후행 공백으로 인한 일부 오류를 디버깅해야합니까? 또한 다른 서버로 이동할 때 모든 서버가 동일한 방식으로 구성되는 것은 아니며 오류를 포착하는 데 시간이 많이 걸립니다. 만약 당신 ?>이 그것을 원한다면, 당신은 또한 후행 공간을 추가하고 팀이 git에서 비난 할 준비가되도록 디버깅해야합니다 ^^
CoffeDeveloper

16

docs 에 따르면 다음과 같은 이유로 파일의 끝에 닫는 태그를 생략하는 것이 좋습니다.

파일이 순수 PHP 코드 인 경우 파일 끝에 PHP 닫기 태그를 생략하는 것이 좋습니다. 이렇게하면 PHP 닫는 태그 뒤에 실수로 공백이나 줄 바꿈이 추가되는 것을 방지 할 수 있습니다. 이는 프로그래머가 스크립트의 해당 지점에서 출력을 보내려는 의도가 없으면 PHP가 출력 버퍼링을 시작하기 때문에 원하지 않는 결과를 초래할 수 있습니다.

PHP 매뉴얼> 언어 레퍼런스> 기본 구문> PHP 태그


10

글쎄, 나는 이유를 알고 있지만 그것을 보여줄 수는 없다.

PHP 코드 만 포함 된 파일의 경우 닫는 태그 ( ?>)는 허용되지 않습니다. PHP에서는 필요하지 않으며 생략하면 실수로 공백이 응답에 삽입되는 것을 방지합니다.

출처 : http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html


23
"허용되지 않는"태그는 아마도 Zend 코딩 표준 일 것입니다. 그러나 PHP 파일 형식에 대한 구문 규칙은 아닙니다.
Matt Huggins

9

글쎄, 그것을 보는 두 가지 방법이 있습니다.

  1. PHP 코드는 XML 처리 명령 집합에 지나지 않으므로 .php확장명을 가진 파일은 PHP 코드에 대해 구문 분석되는 XML 파일에 지나지 않습니다.
  2. PHP는 오픈 태그와 닫기 태그에 대해 XML 처리 명령 형식을 공유합니다. 이를 바탕으로 .php확장명이있는 파일은 유효한 XML 파일 일 수 있지만 반드시 그럴 필요는 없습니다.

첫 번째 경로를 믿는다면 모든 PHP 파일에는 종료 태그를 닫아야합니다. 생략하면 잘못된 XML 파일이 생성됩니다. 그런 다음 다시 시작 <?xml version="1.0" charset="latin-1" ?>선언 없이는 유효한 XML 파일이 없습니다. 따라서 중요한 문제는 아닙니다.

두 번째 경로를 믿는다면 두 가지 유형의 .php파일에 대한 문이 열립니다 .

  • 코드 만 포함 된 파일 (예 : 라이브러리 파일)
  • 네이티브 XML과 코드를 포함하는 파일 (예 : 템플릿 파일)

이를 바탕으로 코드 전용 파일은 닫는 ?>태그 없이 종료해도 됩니다. 그러나 XML 코드 파일은 ?>XML을 무효화하기 때문에 닫지 않고는 종료되지 않습니다 .

하지만 네가 무슨 생각을하는지 알아 중요한 것이 무엇인지 생각하고 PHP 파일을 직접 렌더링하지 않을 것이므로 누가 유효한 XML인지 걱정합니다. 템플릿을 디자인하는 것은 중요합니다. 유효한 XML / HTML 인 경우 일반 브라우저는 단순히 PHP 코드를 표시하지 않습니다 (댓글처럼 처리됨). 따라서 PHP 코드를 실행할 필요없이 템플릿을 조롱 할 수 있습니다 ...

나는 이것이 중요하다고 말하는 것이 아닙니다. 그것은 너무 자주 표현되지 않는 견해이므로 공유하기에 더 좋은 곳은 ...

개인적으로, 나는 라이브러리 파일에서 태그를 닫지 않고 템플릿 파일에서 닫습니다 ... 어려운 것보다 개인적인 선호 (및 코딩 지침)라고 생각합니다 ...


1
이것은 완전히 거짓입니다. PHP는 이러한 태그를 XML로 변환하지 않으므로 불균형이 발생하지 않습니다.
Drachenkatze

7
@Felicitus : "이것은 중요하지 않다고 말하는 것이 아닙니다. 너무 자주 표현되지 않아서 공유하기에 더 좋은 곳은 아닙니다 ..." 라는 부분을 놓친 것 같습니다. PHP가 아닙니다. 태그를 XML로 변환 그것은 파일 (HTML, 또는 편집자 등 같은)는 XML 맥락에서 해석 될 때 일어나는 일에 대해 ...하지만 포인트가 놓친 ...
ircmaxell

7

이미 말한 모든 것 외에도 디버깅해야 할 큰 고통이었던 또 다른 이유가 있습니다.

PHP 5.4가 포함 된 Apache 2.4.6은 닫는 php태그 뒤에 빈 공간이 있으면 프로덕션 시스템에서 실제로 세그먼트 화 오류가 발생 합니다. 나는 마침내 strace로 버그를 좁힐 때까지 몇 시간을 낭비했다 .

Apache에서 발생하는 오류는 다음과 같습니다.

[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)

6

"엔딩 PHP 태그를 건너 뛸 다른 이유가 있습니까 (헤더 문제 이외)?"

이진 출력, CSV 데이터 또는 HTML 이외의 다른 출력을 생성 할 때 불필요한 공백 문자를 실수로 출력하고 싶지 않습니다 .


1
XML 파서가 처음에 여분의 빈 줄이있을 때 출력을 거부했기 때문에 클라이언트가 불만을 제기했습니다. 더 나쁜 것은, 수정되지 않은 구성 파일에서 닫는 태그 다음에 줄이 추가되어 7 대 중 1 대의 서버에서만 발생했습니다.
eswald

5

찬성

단점

결론

나는 태그를 생략하는 것에 찬성하는 주장이 더 강력 해 보인다고 말하고 싶다 ( header () + PHP / Zend "recommendation"). 나는 이것이 구문 일관성 측면에서 본 것 중 가장 "아름다운"솔루션이 아니라는 것을 인정하지만, 무엇이 더 좋을까요?


2

내 질문 이이 질문과 중복으로 표시 되었으므로 닫는 태그를 생략 하지 않는?> 것이 바람직한 이유 를 게시 하는 것이 좋습니다.

  • 완전한 처리 지침 구문 ( <?php ... ?>)으로 PHP 소스는 유효한 SGML 문서이며, SGML 파서에 문제없이 구문 분석되고 처리 될 수 있습니다. 추가 제한이 있으면 유효한 XML / XHTML 일 수도 있습니다.

유효한 XML / HTML / SGML 코드를 작성하는 데 방해가되는 것은 없습니다. PHP 문서 는 이것을 알고 있습니다. 발췌 :

참고 : 또한 PHP를 XML 또는 XHTML에 포함하는 경우 표준을 준수하려면 <? php?> 태그를 사용해야합니다.

물론 PHP 구문은 엄격한 SGML / XML / HTML이 아니며 SGML / XML / HTML이 아닌 문서를 작성합니다. XML을 XML과 호환되도록 XHTML로 변환 할 수있는 것처럼 말입니다.

  • 어느 시점에서 소스를 연결하려고 할 수 있습니다. cat source1.php source2.php닫기 ?>태그 를 생략하여 불일치가 발생 하는 경우 단순히 수행 하는 것만 큼 ​​쉽지 않습니다 .

  • 없이 ?>이 문서는 PHP 탈출 모드 나 PHP에 남아있는 경우 알려 단단 모드 (PI 태그는 무시 <?php열거 나되지 않은 수 있음). PHP 무시 모드로 문서를 일관되게 유지하면 인생이 더 쉬워집니다. 닫히지 않고 잘못 중첩 된 태그 등이있는 문서와 비교하여 올바른 형식의 HTML 문서로 작업하는 것과 같습니다.

  • Dreamweaver와 같은 일부 편집기는 PI left open [1]에서 문제가있을 수 있습니다 .


0

질문을 올바르게 이해하면 출력 버퍼링과 관련이 있으며 이것이 태그 닫기 / 종료에 미치는 영향입니다. 나는 이것이 완전히 유효한 질문인지 확실하지 않습니다. 문제는 출력 버퍼가 모든 컨텐츠를 클라이언트에 보내기 전에 메모리에 보유되는 것을 의미하지는 않습니다. 내용의 일부를 의미합니다.

프로그래머는 의도적으로 버퍼 또는 출력 버퍼를 플러시 할 수 있으므로 PHP의 출력 버퍼 옵션이 닫는 태그가 코딩에 미치는 영향을 실제로 변경합니까? 나는 그렇지 않다고 주장 할 것이다.

그리고 아마도 이것이 대부분의 답변이 개인적인 스타일과 문법으로 돌아간 이유 일 것입니다.


0

PHP 코드는 두 가지로 사용할 수 있습니다.

  1. 클래스 정의 또는 함수 정의와 같은 PHP 코드
  2. PHP를 템플릿 언어로 사용하십시오 (예 : 뷰에서)

경우 1입니다. 닫는 태그가 완전히 유용하지 않은 경우도 있습니다. 그런 경우에는 PHP 오픈 태그 1 개와 닫는 태그 NO 1 개만 표시하고 싶습니다. 이것은 코드를 깨끗하게하고 논리를 프리젠 테이션과 분리 시키므로 좋은 방법입니다. 프레젠테이션 사례 (2.)의 일부는 모든 태그 (PHP 처리 태그조차 포함)를 닫는 것이 당연하다는 것을 알았습니다. 프리젠 테이션

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.