PHP 파싱 / 구문 에러; 그리고 그것들을 해결하는 방법


652

누구나 구문 오류가 발생합니다. 숙련 된 프로그래머조차도 오타를 만듭니다. 새로 온 사람들에게는 학습 과정의 일부일뿐입니다. 그러나 종종 다음과 같은 오류 메시지를 해석하기가 쉽습니다.

PHP 구문 분석 오류 : 구문 오류, 20 행의 index.php에 예기치 않은 '{'

예상치 못한 상징이 항상 진정한 범인은 아닙니다. 그러나 줄 번호는 어디서부터 시작해야하는지 대략적으로 알 수 있습니다.

항상 코드 컨텍스트를보십시오 . 구문 실수는 종종 언급 된 또는 이전 코드 라인 에서 숨겨 집니다 . 코드를 매뉴얼의 구문 예제와 비교하십시오.

모든 사례가 다른 사례와 일치하는 것은 아닙니다. 그러나 구문 오류 를 해결하기위한 일반적인 단계가 있습니다. 이 참고 문헌은 일반적인 함정을 요약했습니다.

밀접한 관련 참조 :

과:

Stack Overflow는 신인 코더도 환영하지만 전문 프로그래밍 문제를 주로 목표로합니다.

  • 모든 사람의 코딩 실수와 좁은 오타에 답하는 것은 대부분 논외로 간주됩니다.
  • 구문 수정 요청을 게시하기 전에 기본 단계 를 따르십시오 .
  • 그래도 문제가 해결되지 않으면 자신의 해결 이니셔티브, 시도한 수정 사항 및 생각 과정을 보여 주거나 잘못되었을 수있는 사항에 대해 알려주십시오.

브라우저에 "SyntaxError : illegal character"와 같은 오류 메시지가 표시 되면 실제로는 그렇지 않습니다관련이 있지만 - 구문 오류 .


공급 업체 코드에서 발생하는 구문 오류 : 마지막으로, 코드베이스를 편집하여 구문 오류가 발생하지 않았지만 외부 공급 업체 패키지 설치 또는 업그레이드 후 PHP 버전 비 호환성으로 인한 것일 수 있으므로 플랫폼에 대한 공급 업체 요구 사항을 확인하십시오. 설정.


1
이것은 대답하기에 충분한 데이터는 아니지만 parsekit_compile_string으로 분석기를 작성하고 더 친숙한 답변을 넣을 수 있습니다. IDE에 통합하면 상당히 유익 할 수 있습니다.
— Owen Beresford

4
당신은 이것에 인상적인 양의 작업을 넣었습니다. 그것을 존중하십시오. 교사가 오류를 빠르게 지적하거나 IDE를 작성하거나 빠른 수정을 구현하는 사람에게 매우 유용 할 것입니다. 그러나 @Panique이 제안한 것처럼 IDE는 이미이 작업의 대부분을 효과적으로 수행합니다. 또한, 많은 경우에, 처음부터 다시 시작하는 것이 좋은 옵션입니다.
— allprog

1
@ Fred-ii- 나는 대부분의 원인이 T_IF / T_FOREACH / ...블록 과 유사하다고 생각합니다 . IF / ELSE / ELSEIF 질문에 대한 더 많은 사용자 정의 요약을 작성하고 싶었지만.
— 마리오

1
@mario 이것을 표현하는 방법을 모르지만,이 Q & A가 약간 재 작성되고 구조화되어야합니까? (temp comment)
— Rizier123 2018 년

2
몇 년 전에 PHP를 배울 때이 목록을 갖고 있었으면 좋겠다. 특히 초보자에게 매우 도움이되었다.
— Chipster 2019

답변:


291

구문 오류는 무엇입니까?

PHP는 C 스타일 및 명령형 프로그래밍 언어에 속합니다 . 엄격한 문법 규칙이있어 잘못 배치 된 기호 나 식별자가 발견 될 때 복구 할 수 없습니다. 코딩 의도를 추측 할 수 없습니다.

함수 정의 구문 요약

가장 중요한 팁

항상 취할 수있는 몇 가지 기본 예방책이 있습니다.

  • 적절한 코드 들여 쓰기를 사용 하거나 높은 코딩 스타일을 채택하십시오. 가독성은 불규칙성을 방지합니다.

  • 구문 강조 와 함께 PHP 용 IDE 또는 편집기를 사용하십시오 . 괄호 / 브래킷 밸런싱에도 도움이됩니다.

    예상 : 세미콜론

  • 설명서 의 언어 참조 및 예제를 읽으십시오 . 두 번, 다소 능숙 해집니다.

파서 오류를 해석하는 방법

일반적인 구문 오류 메시지는 다음과 같습니다.

구문 분석 오류 : 구문 오류, 예기치 못한 T_STRING , 기대 ' ;' 에 file.php 에 라인 (217)

구문 실수 의 가능한 위치를 나열합니다 . 언급 된 파일 이름 과 줄 번호를 참조하십시오 .

모니 커 등은 T_STRING파서 / 토크 나이가 마지막으로 처리 할 수있는 기호 설명합니다. 그러나 이것이 반드시 구문 오류의 원인은 아닙니다.

이전 코드 라인 도 살펴 보는 것이 중요합니다 . 종종 구문 오류는 이전에 발생한 실수 일뿐입니다. 에러 라인 번호는 파서가이를 처리하기 위해 결정적으로 포기한 곳입니다.

구문 오류 해결

구문 히컵을 좁히고 수정하는 방법에는 여러 가지가 있습니다.

  • 언급 된 소스 파일을여십시오. 언급 된 코드 라인을보십시오 .

    • 런 어웨이 스트링과 잘못 배치 된 연산자의 경우 일반적으로 범인을 찾는 위치입니다.

    • 왼쪽에서 오른쪽으로 행을 읽고 각 기호의 기능을 상상하십시오.

  • 보다 정기적으로 선행 라인 도 살펴 봐야 합니다.

    • 특히 누락 된 ;세미콜론은 이전 줄 끝 / 문에서 누락되었습니다. (적어도 문체 관점에서는.)

    • 경우 {코드 블록이 }잘못 폐쇄 또는 중첩, 당신은 소스 코드까지 한층 더 조사해야 할 수도 있습니다. 적절한 코드 들여 쓰기 를 사용 하여 단순화 하십시오 .

  • 상기 봐 구문 색상 지정 !

    • 문자열과 변수 및 상수는 모두 다른 색을 가져야합니다.

    • 작업자도 +-*/.구별해야합니다. 그렇지 않은 경우 잘못된 컨텍스트에있을 수 있습니다.

    • 문자열 색상 지정이 너무 멀리 또는 너무 길어지면 이스케이프 처리되지 않거나 누락 된 닫기 "또는 '문자열 표시 가 발견 된 것 입니다.

    • 서로 같은 색의 문장 부호 두 개가 나란히 있으면 문제가 발생할 수 있습니다. 그렇지 않은 경우 일반적으로 사업자는 고독한있다 ++, --연산자 다음, 또는 괄호. 서로 직접적으로 연결되는 두 개의 문자열 / 식별자는 대부분의 상황에서 올바르지 않습니다.

  • 공백은 당신의 친구 입니다. 따라 어떤 코딩 스타일을.

  • 긴 줄을 일시적으로 끊습니다.

    • 연산자 또는 상수와 문자열 사이 에 줄 바꿈을 자유롭게 추가 할 수 있습니다 . 구문 분석기는 구문 분석 오류에 대한 행 번호를 구체화합니다. 매우 긴 코드를 보는 대신 누락되거나 잘못 배치 된 구문 기호를 분리 할 수 ​​있습니다.

    • 복잡한 if문장을 별개의 또는 중첩 된 if조건 으로 나눕니다 .

    • 긴 수학 공식이나 논리 체인 대신 임시 변수를 사용하여 코드를 단순화하십시오. (가독성이 높을수록 오류가 줄어 듭니다.)

    • 다음 사이에 줄 바꾸기를 추가하십시오.

      1. 올바른 것으로 쉽게 식별 할 수있는 코드
      2. 확실치 않은 부분은
      3. 그리고 파서가 불평하는 줄.

      긴 코드 블록을 분할 하면 구문 오류의 원인을 찾는 데 실제로 도움 이 됩니다.

  • 위반 코드를 주석 처리하십시오 .

    • 문제점 소스를 분리 할 수 ​​없으면 코드 블록을 주석 처리 (및 임시 제거)하십시오.

    • 구문 분석 오류를 제거하자마자 문제의 원인을 찾았습니다. 더 자세히보세요.

    • 때로는 완전한 기능 / 방법 블록을 일시적으로 제거하려고합니다. (중괄호가 일치하지 않고 들여 쓰기가 잘못된 코드 인 경우)

    • 구문 문제를 해결할 수 없으면 주석 처리 된 섹션 을 처음부터 다시 작성 하십시오 .

  • 새로 온 사람은 혼란스러운 구문 구조를 피하십시오.

    • 삼항 ? :조건 연산자는 코드를 압축 할 수 있으며 실제로 유용합니다. 그러나 모든 경우에 가독성을 지원하지는 않습니다. 일반 선호if미지의 동안에는 진술을 선호하십시오.

    • PHP의 대체 구문 ( if:/ elseif:/ endif;)은 템플릿에 일반적이지만 일반적인 {코드 }블록 보다 따르기가 쉽지 않습니다 .

  • 가장 흔한 새로운 실수는 다음과 같습니다.

    • ;명령문 / 라인을 종료하기위한 세미콜론 이 없습니다.

    • 내부 "또는 '이스케이프 처리되지 않은 따옴표에 대한 문자열 따옴표가 일치하지 않습니다 .

    • 특히 문자열 .연결에 대해 잊어 버린 연산자 입니다.

    • 불균형 (괄호 ). 보고 된 줄에 계산하십시오. 그것들의 수가 동일합니까?

  • 하나의 구문 문제를 해결하면 다음 구문을 발견 할 수 있습니다.

    • 한 가지 문제를 해결했지만 아래 코드에서 다른 작물을 자르면 대부분 올바른 길을 가고 있습니다.

    • 새 구문을 편집 한 후 같은 줄에 오류가 발생하면 변경 시도가 실패했을 수 있습니다. (항상 그런 것은 아닙니다.)

  • 수정할 수없는 경우 이전에 작동 한 코드의 백업을 복원하십시오.

    • 소스 코드 버전 관리 시스템을 채택하십시오. 항상 diff깨진 최신 버전의 버전을 볼 수 있습니다 . 구문 문제가 무엇인지 깨달을 수 있습니다.
  • 보이지 않는 길 잃은 유니 코드 문자 : 어떤 경우에는 소스에서 hexeditor 또는 다른 편집기 / 뷰어 를 사용해야합니다 . 코드를 살펴보면 일부 문제를 찾을 수 없습니다.

    • grep --color -P -n "\[\x80-\xFF\]" file.php비 ASCII 기호를 찾기위한 첫 번째 방법으로 시도하십시오 .

    • 특히 BOM, 너비가 0이거나 공백이 아닌 공백 및 스마트 따옴표는 정기적으로 소스 코드를 찾을 수 있습니다.

  • 파일 에 어떤 유형의 줄 바꿈 이 저장되어 있는지 확인 하십시오.

    • PHP 는 캐리지 리턴이 \n아닌 개행을 존중 \r합니다.

    • 때로는 MacOS 사용자에게 문제가됩니다 (오정하지 않은 편집기의 경우 OS X에서도).

    • 종종 한 줄 //또는 #주석을 사용할 때 문제로 나타납니다 . 줄 /*...*/바꿈이 무시 될 때 여러 줄 주석은 파서를 방해하지 않습니다.

  • 구문 오류가 웹을 통해 전송되지 않는 경우 : 컴퓨터에 구문 오류가 있습니다. 그러나 동일한 파일을 온라인에 게시해도 더 이상 표시되지 않습니다. 다음 두 가지 중 하나만 의미 할 수 있습니다.

    • 잘못된 파일을보고 있습니다!

    • 또는 코드에 보이지 않는 길 잃은 유니 코드가 포함되어 있습니다 (위 참조). 웹 양식에서 텍스트 편집기로 코드를 다시 복사하면됩니다.

  • PHP 버전을 확인하십시오 . 모든 서버에서 모든 구문 구성을 사용할 수있는 것은 아닙니다.

    • php -v 명령 줄 인터프리터

    • <?php phpinfo(); 웹 서버를 통해 호출 된 것을 위해.


    그것들이 반드시 같은 것은 아닙니다. 특히 프레임 워크로 작업 할 때 일치하게됩니다.

  • PHP의 예약 키워드 를 함수 / 메소드, 클래스 또는 상수의 식별자로 사용하지 마십시오 .

  • 시련과 오류는 최후의 수단입니다.

다른 모든 방법이 실패하면 언제든지 오류 메시지를 Google에 표시 할 수 있습니다 . 구문 기호는 검색하기 쉽지 않습니다 (스택 오버플로 자체는 SymbolHound에 의해 색인화 됨 ). 따라서 관련된 내용을 찾기 전에 몇 페이지를 더 살펴 봐야 할 수도 있습니다.

추가 안내서 :

죽음의 흰색 화면

웹 사이트가 비어있는 경우 일반적으로 구문 오류가 원인입니다. 다음을 사용하여 디스플레이를 활성화하십시오.

  • error_reporting = E_ALL
  • display_errors = 1

당신의에서 php.ini일반적으로, 또는를 통해 .htaccess방법 mod_php에 대한, 또는.user.ini 하여 FastCGI 설정과 함께.

PHP가 심지어 첫 줄을 해석 / 실행할 수 없기 때문에 깨진 스크립트 내에서 그것을 활성화하는 것은 너무 늦습니다. 빠른 해결 방법은 래퍼 스크립트를 작성하는 것입니다 test.php.

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

그런 다음이 랩퍼 스크립트에 액세스하여 실패한 코드를 호출하십시오.

또한 HTTP 500 응답으로 스크립트가 충돌 할 때 PHP를 활성화 error_log하고 웹 서버를error.log 살펴 보는 데 도움이됩니다 .


error_reporting(E_ALL | E_STRICT);이전 버전의 PHP
— Geo

2
NetBeans와 같은 일부 IDE는 구문 강조 기능뿐만 아니라 코드 형식도 지원합니다. 코드를 올바르게 포맷하고 때때로 IDE를 다시 포맷하도록 요청하는 습관을들이는 경우, 일치하지 않는 괄호와 같은 문제를 찾기가 어려울 수 있습니다.
— Josep Valls

115

나는이 주제가 완전히 지나치게 논의되거나 복잡해 졌다고 생각한다. IDE를 사용하면 구문 오류를 완전히 피할 수 있습니다. 심지어 IDE없이 작업하는 것은 전문가가 아닌 것이라고 말할 수 있습니다. 왜? 최신 IDE는 입력 할 때마다 구문을 확인하기 때문에. 코드를 작성하고 전체 줄이 빨간색으로 바뀌고 큰 경고 알림에 구문 오류의 정확한 유형과 정확한 위치가 표시되면 다른 솔루션을 검색 할 필요가 없습니다.

구문 검사 IDE를 사용한다는 것은 다음을 의미합니다.

입력하는 즉시 올바르게 표시하기 때문에 구문 오류가 다시 발생하지 않습니다. 진심으로.

구문 검사 기능이있는 뛰어난 IDE (모두 Linux, Windows 및 Mac에서 사용 가능) :

  1. NetBeans [무료]
  2. PHPStorm [$ 199 USD]
  3. 이클립스 와 PHP 플러그인 [무료]
  4. Sublime [$ 80 USD] (주로 텍스트 편집기이지만 PHP Syntax Parser 와 같은 플러그인으로 확장 가능 )

2
분명히 그렇습니다. 그러나 여기에 IDE를 다시 나열하면 구문 유용성이 다른 부분을 조금 더 자세히 설명 할 수 있습니까? Sublime은 대부분 IDE가 아닌 편집기입니다. 그러나 더 예쁘고 빠릅니다. 기본적으로 구문을 높이지만 대괄호 일치에서도 유효합니다. 예를 들어, PHPStorm과 달리 T_CONSTANT_AND_ENCAPSED 오류를 쉽게 발견 할 수 있습니다. 그러나 인라인 오류에 대해 더 구불 구불 한 행을 수행합니다. NetBeans의 구문 힌트는 PHP보다 훨씬 더 암호로 사용되었습니다 (허용 된 구문을 나열 함). 찬반 양론에 대한 경험을 공유 할 수 있습니까? 가장 좋아하는 Eclipse / PDT 또는 ..?
— mario

@mario 나는 당신이 주제에 깊이 빠져 있다고 생각하기 때문에 여기서 잘못 말하고 싶지는 않지만, 내가 작성한 모든 코드 (그리고 내 팀 동료, 친구, 프리랜서 파트너)는 IDE에서 작성된 적이 없다. 구문 오류가 있습니다. 따라서 적어도 Netbeans / PHPStorm의 구문 검사가 매우 강력하다고 생각합니다. 하지만 당신의 질문을 잘못 읽었을 것입니다. Gimme some hours ...;)
— Sliq

당신의 대답은 이미 밝혀졌습니다. 질문의 99 %에 해당합니다. 그러나 여기서는 IDE가 더 친숙한 툴팁을 제공 하는 트레이드 오프 고려 사항을 원합니다 . 당신이 충분히 정통하면 착색과 구불 구불 한 선으로도 충분할 것입니다. 그러나 나는 초보자들에게 그 차이가 더 중요하다고 생각합니다.
— mario

때로는 IDE가 실현 가능한 옵션이 아닙니다. 예를 들어, WordPress 테마 또는 플러그인을 빠르게 편집합니다. 예, 모든 코드를 IDE에 복사 할 수는 있지만 빠른 편집을 원할 때 코드를 열고 붙여 넣은 다음 헤더를 설정하고 다른 시간을 낭비해야합니다. 이제 새로운 기능을 개발하거나 처음부터 시작한다면 IDE에서 수행하십시오. 처음 시작할 때 약간의 시간이 더 걸리는 것을 후회하지 않을 것입니다.
— 1934286

IDE를 도구 상자가 아니라 예고편으로 봅니다. FIX는 아니지만 구문 오류를 찾아 방지하는 데 도움이 될 수 있습니다. 여기에 많은 대답은 코드를 깨끗하게 유지하면 오류를 일으킬 가능성이 적고 쉽게 발견 할 수 있다고 말합니다. 자동 들여 쓰기, 코드 힌트, 변수 발생, 자동 닫는 대괄호 및 자동 서식을 사용하면 하루에 많은 오타를 절약 할 수 있으며 내가 그것을 사용하는 주요 이점입니다. 이것은이 질문의 범위 (디버거, 데이터베이스 커넥터, uml 다이어그램 등) 이외의 모든 것을 계산하지 않습니다. IDE는 시간을 절약하고 구문 오류 이상을 방지합니다.
— Louis Loudog Trottier

58

예기치 않은 [

요즘 예기치 않은 [배열 괄호는 오래된 PHP 버전에서 일반적으로 나타납니다. 짧은 배열 구문 PHP 보낸 가능 > = 5.4 . 이전 설치 만 지원 array()합니다.

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         ⇑

이전 PHP 버전에서는 배열 함수 결과 역 참조를 사용할 수 없습니다.

$result = get_whatever()["key"];
                      ⇑

참조-이 오류는 PHP에서 무엇을 의미합니까? - "구문 오류, 예기치 않은 \[" 은 가장 일반적이고 실용적인 해결 방법을 보여줍니다.

하지만 항상 PHP 설치를 업그레이드하는 것이 좋습니다. 공유 웹 호스팅 계획의 경우, 먼저 SetHandler php56-fcgi새로운 런타임을 가능하게하는 데 사용할 수 있는지 먼저 조사하십시오 .

또한보십시오:

BTW, 이전 + 느린 PHP 버전에 정말로 집착하는 경우 전 처리기 및 PHP 5.4 구문 다운 컨버터도 있습니다.

예기치 않은[ 구문 오류의 다른 원인

PHP 버전이 일치하지 않으면 종종 오타 나 새로운 구문 오류가 발생합니다.

  • PHP 7조차도 클래스에서 배열 속성 선언 / 표현을 사용할 수 없습니다 .

    protected $var["x"] = "Nope";
                  ⇑
  • [중괄호 {또는 괄호 를 여는 것과 혼동 (하는 것이 일반적인 감독입니다.

    foreach [$a as $b)
            ⇑

    또는:

    function foobar[$a, $b, $c] {
                   ⇑
  • 또는 상수 (PHP 5.6 이전)를 배열로 역 참조하려고합니다.

    $var = const[123];
           ⇑

    적어도 PHP const는 이것을 상수 이름으로 해석합니다 .

    배열 변수 (여기서는 일반적인 원인)에 액세스하려는 경우 선행 $sigil 을 추가하십시오 $varname.

  • global연관 배열의 멤버 에서 키워드 를 사용하려고합니다 . 유효한 구문이 아닙니다 :

    global $var['key'];


예기치 않은 ] 닫는 대괄호

이것은 다소 드물지만 종료 배열 ]괄호 와 구문 사고가 있습니다 .

  • )괄호 또는 }중괄호 와 다시 일치하지 않는 것이 일반적입니다.

    function foobar($a, $b, $c] {
                              ⇑
  • 또는 배열이없는 배열을 끝내려고합니다.

    $var = 2];

    여러 줄 및 중첩 배열 선언 에서 종종 발생합니다 .

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 ⇑

    그렇다면 IDE에서 브래킷 일치를 사용하여 조기 ]어레이 클로저 를 찾으십시오 . 최소한 더 많은 간격과 줄 바꾸기를 사용하여 좁히십시오.


위의 'PHP 5.4 구문 다운 컨버터' github.com/IonutBajescu/short-arrays-to-long-rays 링크 가 끊어졌습니다.
— Danimal Reks

46

예상치 못한 T_VARIABLE

"예기치 않은 T_VARIABLE"은 리터럴 $variable이름이 있으며 현재 표현 / 문구 구조에 맞지 않음을 의미합니다 .

의도적으로 추상 / 정확한 연산자 + $ 변수 다이어그램

  1. 세미콜론 누락

    가장 일반적으로 이전 줄에서 누락 된 세미콜론 을 나타냅니다 . 명령문 다음의 변수 지정은 어디를 볼 수 있는지를 나타내는 좋은 지표입니다.

           ⇓
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. 문자열 연결

    빈번한 사고는 문자열 연결입니다잊혀진 .연산자 .

                                   ⇓
    print "Here comes the value: "  $value;

    Btw, 당신은 선호해야 가독성에 도움이 될 때마다 문자열 보간 (큰 따옴표의 기본 변수)을 . 이러한 구문 문제를 피할 수 있습니다.

    문자열 보간은 스크립팅 언어 핵심 기능입니다. 그것을 사용하는 데 부끄러움이 없습니다. 변수 .연결이 더 빠르다 는 미세 최적화 조언 무시 . 그렇지 않습니다.

  3. 누락 된 표현식 연산자

    물론 산술 연산과 같은 다른 표현식에서도 동일한 문제가 발생할 수 있습니다.

               ⇓
    print 4 + 7 $var;

    PHP는 추측 할 수 없다변수를 더하거나 빼거나 비교해야하는지 여기서 .

  4. 기울기

    구문 분석기는 예상되는 쉼표 ,를 표시하는 배열 채우기와 같이 구문 목록과 동일합니다 .

                                          ⇓
    $var = array("1" => $val, $val2, $val3 $val4);

    또는 함수 매개 변수 목록 :

                                    ⇓
    function myfunc($param1, $param2 $param3, $param4)

    이와 함께 with list또는 globalstatement 또는 루프에 ;세미콜론이 없을 때이 내용을 볼 수 있습니다 for.

  5. 클래스 선언

    이 파서 오류는 클래스 선언 에서도 발생합니다 . 표현식이 아닌 정적 상수 만 할당 할 수 있습니다. 따라서 파서는 변수를 할당 된 데이터로 불평합니다.

    class xyz {      ⇓
        var $value = $_GET["input"];

    비교할 }수 없는 닫는 중괄호는 특히 여기에서 이어질 수 있습니다. 메소드가 너무 일찍 종료되면 (적절한 들여 쓰기를 사용하십시오!) 일반적으로 클래스 변수에 길잃은 변수가 잘못 배치됩니다.

  6. 식별자 뒤의 변수

    변수가 식별자를 직접 따르지 않도록 할 수도 없습니다 .

                 ⇓
    $this->myFunc$VAR();

    Btw, 이것은 아마도 변수 변수 를 사용하려는 의도의 일반적인 예 입니다. 이 경우 $this->{"myFunc$VAR"}();예를 들어 변수 속성 조회가 가능 합니다.

    변수 변수를 사용하는 것은 예외입니다. 신규 이민자들은 배열이 더 단순하고 더 적합 할 때에도 너무 캐주얼하게 사용하려고합니다.

  7. 언어 구성 후 괄호 누락

    성급한 타이핑은 ifand for및 foreachstatement에 대한 여는 괄호 또는 닫는 괄호를 잊을 수 있습니다 .

           ⇓
    foreach $array as $key) {

    솔루션 : (명령문과 변수 사이에 누락 된 개구부 를 추가하십시오 .

                          ⇓
    if ($var = pdo_query($sql) {
         $result = …

    곱슬 {걸림쇠가 종료하지 않고, 상기 코드 블록 열리지 if와 식 )제 닫는 괄호.

  8. 그렇지 않으면 조건을 기대하지 않습니다

         ⇓
    else ($var >= 0)

    솔루션 :에서 조건을 제거 else하거나 사용하십시오 elseif.

  9. 폐쇄 용 브래킷 필요

         ⇓
    function() uses $var {}

    해결책 : 주위에 대괄호를 추가하십시오 $var.

  10. 보이지 않는 공백

    "Invisible stray Unicode" 에 대한 참조 답변 (예 : 비 공백 공백 ) 에서 언급했듯이 , 다음과 같은 의심없는 코드에 대해이 오류가 표시 될 수 있습니다.

    <?php
                              ⇐
    $var = new PDO(...);

    파일 시작 및 복사하여 붙여 넣은 코드에서 다소 널리 퍼져 있습니다. 코드에 시각적으로 구문 문제가없는 것으로 보이면 hexeditor를 확인하십시오.

또한보십시오


32

예기치 않은 T_CONSTANT_ENCAPSED_STRING
예기치 않은 T_ENCAPSED_AND_WHITESPACE

다루기 힘든 이름 T_CONSTANT_ENCAPSED_STRING과 T_ENCAPSED_AND_WHITESPACE인용 된 리터럴 참조"string" .

그것들은 다른 상황에서 사용되지만 구문 문제는 매우 유사합니다. T_ENCAPSED… 경고는 큰 따옴표로 묶인 문자열 컨텍스트에서 발생하지만 T_CONSTANT… 문자열은 종종 일반 PHP 표현식 또는 명령문에서 엉망입니다.

  1. 잘못된 변수 보간

    그리고 잘못된 PHP 변수 보간에 가장 자주 나타납니다.

                              ⇓     ⇓
    echo "Here comes a $wrong['array'] access";

    배열 키 인용은 PHP 컨텍스트에서 필수입니다. 그러나 큰 따옴표로 묶인 문자열 (또는 HEREDOCs)에서 이것은 실수입니다. 파서 'string'는 일반적으로 거기에 리터럴 식별자 / 키가 필요하기 때문에 포함 된 작은 따옴표에 대해 불평합니다 .

    보다 정확하게 는 배열 참조를 위해 큰 따옴표 안에 PHP2 스타일의 간단한 구문 을 사용하는 것이 유효합니다 :

    echo "This is only $valid[here] ...";

    그러나 중첩 배열이나 더 깊은 객체 참조에는 복잡한 곱슬 문자열 표현식 구문이 필요 합니다.

    echo "Use {$array['as_usual']} with curly syntax.";

    확실하지 않은 경우 일반적으로 사용하는 것이 더 안전합니다. 종종 더 읽기 쉬운 것으로 간주됩니다. 더 나은 IDE는 실제로 고유 한 구문 색상을 사용합니다.

  2. 연결 누락

    문자열이 표현식 뒤에 있지만 연결 또는 다른 연산자가 없으면 PHP가 문자열 리터럴에 대해 불평하는 것을 볼 수 있습니다.

                           ⇓
    print "Hello " . WORLD  " !";

    그것은 당신과 나에게 분명하지만 PHP 는 문자열이 거기에 추가되어야한다는 것을 추측 할 수 없습니다 .

  3. 혼란스러운 문자열 인용 엔클로저

    문자열 구분 기호를 혼동 할 때 동일한 구문 오류가 발생합니다 . '작은 "따옴표 나 큰 따옴표로 시작하는 문자열 도 동일하게 끝납니다.

                    ⇓
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    이 예는 큰 따옴표로 시작했습니다. 그러나 큰 따옴표도 HTML 속성으로 지정되었습니다. 그러나 의도 한 연결 연산자는 작은 따옴표로 묶인 두 번째 문자열의 일부로 해석되었습니다.

    팁 : 작은 따옴표와 큰 따옴표로 묶은 문자열에 약간 다른 색상을 사용하도록 편집기 / IDE를 설정하십시오. (또한 텍스트 출력을위한 큰 따옴표로 묶인 문자열, 상수 값과 같은 작은 따옴표로 묶인 문자열을 선호하는 응용 프로그램 논리에 도움이됩니다.)

    이것은 큰 따옴표를 먼저 사용하지 않아야하는 좋은 예입니다. 대신 사용하십시오\" HTML 속성의 따옴표에 적절한 이스케이프 를 사용하십시오.

    print "<a href=\"{$link}\">click here</a>";

    이로 인해 구문 혼동이 발생할 수 있지만 더 나은 IDE / 편집기는 모두 이스케이프 된 따옴표를 다르게 색칠하여 도움을줍니다.

  4. 오프닝 견적 누락

    마찬가지로 오프닝 "/ '따옴표를 잊어 버렸습니다. 파서 오류에 대한 조리법을 :

                   ⇓
     make_url(login', 'open');

    여기 ', ' 분명히 login문자열 매개 변수로 의도 되었을 때 베어 워드 다음에 문자열 리터럴이 됩니다.

  5. 배열 목록

    ,배열 생성 블록에서 쉼표 를 놓치면 구문 분석기에 두 개의 연속 문자열이 표시됩니다.

    array(               ⇓
         "key" => "value"
         "next" => "....",
    );

    마지막 줄에는 항상 추가 쉼표가 포함될 수 있지만 그 사이에있는 쉼표를 간과하는 것은 용서할 수 없습니다. 구문 강조 없이는 찾기가 어렵습니다.

  6. 기능 파라미터 목록

    함수 호출도 마찬가지입니다 .

                             ⇓
    myfunc(123, "text", "and"  "more")
  7. 폭주

    일반적인 변형은 잊혀진 문자열 종결 자입니다.

                                    ⇓
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    PHP는 서로 직접적으로 따르는 두 개의 문자열 리터럴에 대해 불평합니다. 그러나 실제 원인은 닫히지 않은 이전 문자열입니다.

또한보십시오


27

예기치 않은 T_STRING

T_STRING약간의 오해입니다. 인용 된 것은 아닙니다 "string". 원시 식별자가 발생했음을 의미합니다. bare단어에서 남은 단어 CONSTANT또는 함수 이름, 따옴표없는 문자열 또는 일반 텍스트 까지 다양 합니다.

  1. 잘못 인용 된 문자열

    그러나이 구문 오류는 잘못 인용 된 문자열 값에 가장 일반적입니다. 이스케이프 처리되지 않고 길을 잃 "거나 '인용 부호를 잘못 표시하면

                   ⇓                  ⇓
     echo "<a href="http://example.com">click here</a>";

    구문 강조는 이러한 실수를 매우 분명하게 만듭니다. 문자열 엔클로저 로 사용 된 것에 따라 \"큰 따옴표 또는 \'작은 따옴표 를 이스케이프 처리하기 위해 백 슬래시를 사용해야합니다 .

    • 편의상 큰 따옴표 안에 일반 HTML을 출력 할 때는 작은 따옴표를 선호해야합니다.
    • 변수를 보간하려는 경우 큰 따옴표로 묶은 문자열을 사용하고 이스케이프 리터럴을 조심하십시오. " 큰 따옴표를 피하십시오.
    • 더 긴 출력의 경우, 다수의 선호 echo/의 print대신에 밖으로 탈출의 라인. HEREDOC 섹션을 더 잘 고려 하십시오.

    또 다른 예는 PHP로 생성 된 HTML 코드 내에서 PHP 항목을 사용하는 것입니다.

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    이것은 $text많은 행이 있고 개발자가 전체 PHP 변수 값을 보지 못하고 소스를 잊어 버린 코드에 집중하면 발생합니다. 예는 여기

    참조 PHP에서 인용 - 단일 및 이중 인용 문자열의 차이점은 무엇입니까? .

  2. 닫히지 않은 문자열

    닫는" 것을 놓치면 일반적으로 구문 오류가 나중에 구체화됩니다. 종료되지 않은 문자열은 종종 다음 의도 된 문자열 값까지 약간의 코드를 소비합니다.

                                                           ⇓
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    T_STRING파서가 항의 할 수있는 것은 문자 그대로가 아닙니다 . 또 다른 빈번한 변형은 Unexpected '>'인용되지 않은 리터럴 HTML입니다.

  3. 비 프로그래밍 문자열 따옴표

    블로그 나 웹 사이트에서 코드 를 복사하여 붙여 넣으면 때로는 유효하지 않은 코드가 생길 수 있습니다. 활자체 인용문은 PHP가 기대하는 것이 아닙니다 .

    $text = ’Something something..’ + ”these ain't quotes”;

    활자체 / 스마트 따옴표는 유니 코드 기호입니다. PHP는 그것들을 인접한 영숫자 텍스트의 일부로 취급합니다. 예를 들어 ”these상수 식별자로 해석됩니다. 그러나 다음 텍스트 리터럴은 파서에서 베어 워드 / T_STRING으로 표시됩니다.

  4. 누락 된 세미콜론; 다시

    이전 줄에 종료되지 않은 표현식이 있으면 다음 명령문 또는 언어 구문이 원시 식별자로 표시됩니다.

           ⇓
    func1()
    function2();

    PHP는 두 함수를 차례대로 실행하거나 결과를 곱하거나 추가하거나 비교하거나 한 가지만 실행하려는 경우 알 수 없습니다 ||.

  5. 짧은 오픈 태그 및 <?xmlPHP 스크립트에서 헤더

    이것은 드문 일입니다. 그러나 short_open_tags가 활성화 되어 있으면 XML 선언으로 PHP 스크립트 를 시작할 수 없습니다 .

          ⇓
    <?xml version="1.0"?>

    PHP는 그 내용을보고 <?그 자체를 되 찾을 것입니다. 길 잃은 xml것이 무엇인지 이해하지 못합니다 . 상수로 해석됩니다. 그러나 이것은 version또 다른 문자 / 상수로 보일 것입니다. 그리고 파서는 사이에 표현식 연산자가 없으면 두 개의 후속 리터럴 / 값을 이해할 수 없으므로 파서가 실패합니다.

  6. 보이지 않는 유니 코드 문자

    구문 오류의 가장 끔찍한 원인은 공백 이 아닌 공간 과 같은 유니 코드 기호 입니다. PHP는 유니 코드 문자를 식별자 이름으로 허용합니다. 의심스럽지 않은 코드에 대해 T_STRING 파서 불만이 접수 ​​된 경우 :

    <?php
        print 123;

    다른 텍스트 편집기를 분리해야합니다. 또는 hexeditor도. 일반 공간과 줄 바꿈처럼 보이는 곳에 보이지 않는 상수가 포함될 수 있습니다. Java 기반 IDE는 폭이 0 인 공백, 단락 구분 기호 등으로 UTF-8 BOM이 엉망인 경우가 종종 있습니다. 모든 항목을 다시 편집하고 공백을 제거하고 일반 공백을 다시 추가하십시오.

    ;각 줄 시작에 중복 명령문 구분 기호를 추가하여 범위를 좁힐 수 있습니다 .

    <?php
        ;print 123;

    여기서 ;세미콜론을 추가 하면 앞의 보이지 않는 문자가 정의되지 않은 상수 참조 (표로 표현)로 변환됩니다. 그 대가로 PHP가 유용한 알림을 생성합니다.

  7. 변수 이름 앞에`$`부호가 없습니다.

    PHP의 변수 는 달러 기호와 변수 이름으로 표시됩니다.

    달러 기호 ( $)는 식별자를 변수의 이름으로 표시 하는 시길 입니다. 이시길이 없으면 식별자는 언어 키워드 또는 상수 일 수 있습니다.

    다른 언어 (C, Java, JavaScript 등) 로 작성된 코드에서 PHP 코드가 "번역" 되었을 때 발생하는 일반적인 오류 입니다. 이러한 경우 변수 유형의 선언 (원래 코드가 유형이 지정된 변수를 사용하는 언어로 작성된 경우)도 몰래 발생하여이 오류가 발생할 수 있습니다.

  8. 이스케이프 된 따옴표

    \문자열에 사용 하면 특별한 의미가 있습니다. 이를 " 이스케이프 문자 "라고하며 일반적으로 파서가 다음 문자를 문자 그대로 가져 오도록 지시합니다.

    예 : echo 'Jim said \'Hello\'';인쇄Jim said 'hello'

    문자열의 닫는 따옴표를 이스케이프하면 닫는 따옴표는 문자 그대로 취해지지 않습니다. 즉, 문자열의 일부로 인쇄 가능한 따옴표처럼 문자열을 닫지 않습니다. 다음 문자열을 열거 나 스크립트 끝에서 일반적으로 구문 분석 오류로 표시됩니다.

    Windows에서 경로를 지정할 때 매우 일반적인 오류 : "C:\xampp\htdocs\"잘못되었습니다. 당신은 필요합니다 "C:\\xampp\\htdocs\\".


18

예기치 않은 (

여는 괄호는 일반적으로 if/ foreach/ for/ array/ 와 같은 언어 구성을 따르 list거나 산술 표현식을 시작합니다. "strings", previous (), lone $및 일부 일반적인 선언 컨텍스트에서 구문 상 올바르지 않습니다 .

  1. 함수 선언 파라미터

    이 오류의 경우는 드물지만 표현식을 기본 함수 매개 변수로 사용하려고합니다 . PHP7에서도 지원되지 않습니다 :

    function header_fallback($value, $expires = time() + 90000) {

    함수 선언의 매개 변수는 리터럴 값 또는 상수 표현식 일 수 있습니다. 함수 호출과 달리 자유롭게 사용할 수있는 곳 whatever(1+something()*2)등

  2. 클래스 속성 기본값

    표현식이 아닌 리터럴 / 상수 값만 허용되는 클래스 멤버 선언 과 동일 합니다.

    class xyz {                   ⇓
        var $default = get_config("xyz_default");

    그런 것들을 생성자에 넣으십시오. PHP 속성이 함수를 허용하지 않는 이유 도 참조하십시오 .

    PHP 7은 var $xy = 1 + 2 +3;상수 표현 만 허용 합니다.

  3. PHP의 자바 스크립트 문법

    PHP에서 JavaScript 또는 jQuery 구문을 사용할 수없는 이유는 다음과 같습니다.

    <?php      ⇓
        print $(document).text();

    이 경우 일반적으로 종료되지 않은 선행 문자열을 나타냅니다. 그리고 <script>PHP 코드 컨텍스트로 유출되는 리터럴 섹션.

  4. isset (()), 비어 있음, 키, 다음, 현재

    모두 isset()와 것은 empty()언어에 내장 된 기능이 아닌 함수입니다. 그들은 직접 변수에 액세스해야합니다 . 실수로 괄호 쌍을 너무 많이 추가하면 표현식이 작성됩니다.

              ⇓
    if (isset(($_GET["id"]))) {

    암시 적 변수 이름 액세스가 필요한 모든 언어 구성에도 동일하게 적용됩니다. 이 내장은 언어 문법의 일부이므로 장식적인 추가 괄호를 허용하지 않습니다.

    변수 참조가 필요하지만 표현식 결과가 전달되는 사용자 레벨 함수는 대신 런타임 오류가 발생합니다.


예기치 않은 )

  1. 부재 함수 파라미터

    함수 호출에서 마지막으로 쉼표를 사용할 수 없습니다 . PHP는 거기에 가치가 있기 때문에 조기 종결 )괄호 에 대해 불평 합니다.

                  ⇓
    callfunc(1, 2, );

    후행 쉼표는 array()또는 list()구성 에서만 허용됩니다 .

  2. 미완성 된 표현

    산술 표현식에서 무언가를 잊어 버린 경우 파서는 포기합니다. 어떻게 해석해야합니까?

                   ⇓
    $var = 2 * (1 + );

    그리고 닫는 것을 잊어 버린 경우 )예기치 않은 세미콜론에 대한 불만이 표시됩니다.

  3. Foreach as constant

    들어 잊어 가변 $제어 문에서 접두사 당신은 볼 것이다 :

                       ↓    ⇓
    foreach ($array as wrong) {

    여기서 PHP는 때때로 ::대신 기대한다고 말합니다 . class :: $ variable 클래스가 예상되는 $ variable 표현식을 만족시킬 수 있기 때문에 ..


예기치 않은 {

중괄호 {와 }코드 블록을 묶습니다. 그리고 그들에 대한 구문 오류는 일반적으로 잘못된 중첩을 나타냅니다.

  1. 에서 일치하지 않는 하위 표현식 if

    가장 일반적으로 불균형 (이며) 파서가 오프닝 곱슬 {이 너무 일찍 나타나는 것에 대해 불평하는 경우 원인이됩니다 . 간단한 예 :

                                  ⇓
    if (($x == $y) && (2 == true) {

    괄호를 세거나 IDE를 사용하십시오. 또한 공백없이 코드를 작성하지 마십시오. 가독성이 중요합니다.

  2. 식 문맥에서의 {와}

    식에 중괄호를 사용할 수 없습니다. 괄호와 중괄호를 혼동하면 언어 문법을 준수하지 않습니다.

               ⇓
    $var = 5 * {7 + $x};

    로컬 범위 변수와 같은 식별자 구성에는 몇 가지 예외가 있습니다 ${references}.

  3. 변수 변수 또는 곱슬 var 표현식

    이것은 매우 드 rare니다. 그러나 복잡한 변수 표현에 대한 불만을 제기 {하고 }파싱 할 수도 있습니다 .

                          ⇓
    print "Hello {$world[2{]} !";

    }그러한 상황에서 예상치 못한 가능성이 더 높지만 .


예기치 않은 }

"예기치 않은 }"오류가 발생하면 대부분 코드 블록을 너무 일찍 닫은 것입니다.

  1. 코드 블록의 마지막 문장

    종료되지 않은 표현에 발생할 수 있습니다.

    함수 / 코드 블록의 마지막 행에 후미 ;세미콜론 이없는 경우 :

    function whatever() {
        doStuff()
    }            ⇧

    여기서 파서는 여전히 + 25;함수 결과 또는 다른 것에 추가 하고 싶었는지 알 수 없습니다 .

  2. 잘못된 블록 중첩 / 잊어 버린 {

    코드 블록이 }너무 일찍 닫히거나 개구부를 잊었을 때 때때로이 파서 오류가 표시됩니다 {.

    function doStuff() {
        if (true)    ⇦
            print "yes";
        }
    }   ⇧

    위의 스 니펫에서 if여는 {중괄호 가 없었습니다 . 따라서 }아래 의 닫는 것이 중복되었습니다. 따라서 }기능을위한 다음 닫힘 은 원래 여는 {중괄호와 연관되지 않았습니다 .

    이러한 오류는 적절한 코드 들여 쓰기없이 찾기가 훨씬 더 어렵습니다. IDE와 대괄호 일치를 사용하십시오.


예기치 않은 {예상(

조건 / 선언 헤더 및 코드 블록이 필요한 언어 구문 이이 오류를 트리거합니다.

  1. 파라미터 목록

    예를 들어 매개 변수 목록 이없는 잘못 선언 된 함수 는 허용되지 않습니다.

                     ⇓
    function whatever {
    }
  2. 제어문 조건

    또한 if조건없이 가질 수 없습니다 .

      ⇓
    if {
    }

    분명히 말이되지 않습니다. 평범한 용의자 for/ foreach, while/ do등에 대해서도 마찬가지입니다 .

    이 특정 오류가 발생하면 몇 가지 수동 예제를 찾아야합니다.


1
이 게시물에서 내 질문에 대한 답변을 찾고 있었지만 "예기치 않은 {"문제에 대한 답변을 직접 찾았습니다. 그 이유는 내 답변과 공유하고 싶었습니다. 문제는 줄 바꿈 인코딩이었습니다. 어쨌든 일부는 파일은 매킨토시 줄 바꿈을 사용했지만 Windows 줄 바꿈으로 변경하면 내 문제 (localhost (WAMP)에서 모든 것이 작동하지만 Linux 웹 서버에서는 작동하지 않음)가 해결되었습니다.
— Edgars Aivars

@EdgarsAivars 댓글 주셔서 감사합니다! 플랫폼 별 줄 바꿈은 실제로 드물고 까다로운 문제입니다. 아마 여기에서도 언급 할 것입니다. ( 다른 참고 답변 에서 따로 언급 된 것 입니다.)
— mario

예기치 않은}을 얻는 것이 내 코드 조각이 php short tag <? <? php 대신-다른 서버에서 작동 하면서이 것을 찾는 데 시간이 걸렸습니다.
— c7borg

14

예기치 않은 $ end

PHP가 "예기치 않은 $end" 에 대해 이야기 할 때 코드가 너무 일찍 종료되었음을 의미합니다. (이 메시지는 문자 그대로 받아 들일 때 약간 오해의 소지가 있습니다. 이따금 새로 온 사람들이 가정하는 "$ end"라는 변수에 관한 것이 아닙니다. "파일의 끝"을 말합니다 EOF.)

원인 : 불균형 {및 }코드 블록 / 및 함수 또는 클래스 선언에 사용됩니다.

그건 거의 항상 누락에 대해 }앞의 코드 블록을 닫습니다 중괄호.

  • 다시 말하지만 이러한 문제를 피하려면 적절한 들여 쓰기를 사용하십시오.

  • 대괄호가 일치하는 IDE를 사용하여 }amiss 위치를 찾으십시오 . 대부분의 IDE 및 텍스트 편집기에는 키보드 단축키가 있습니다.

    • NetBeans, PhpStorm, 코모도 : Ctrl[및Ctrl]
    • 이클립스, 압 타나 : CtrlShiftP
    • Atom, Sublime : Ctrlm-젠드 스튜디오CtrlM
    • Geany, 메모장 ++ :-Joe CtrlB: CtrlG-Emacs : C-M-n-Vim :%

대부분의 IDE는 또한 중괄호, 괄호 및 괄호 일치 를 강조 표시합니다. 상관 관계를 검사하기가 매우 쉽습니다.

IDE에서 대괄호 일치

종결되지 않은 표현

그리고 Unexpected $end문법 / 파서 오류가 종료되지 않은 표현이나 문장 발생할 수 있습니다 :

  • $var = func(1, ?>EOF

따라서 스크립트의 끝 부분을 먼저보십시오. 후행 ;은 종종 모든 PHP 스크립트의 마지막 문장에 중복됩니다. 그러나 당신 은 하나 가 있어야합니다. 정확하게는 그러한 구문 문제를 좁히기 때문입니다.

들여 쓰기 된 HEREDOC 마커

HEREDOC 또는 NOWDOC 문자열 과 함께 또 다른 일반적인 발생이 나타납니다 . 선행 공백, 탭 등은 종료 표시가 무시됩니다.

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

따라서 파서는 파일이 끝날 때까지 HEREDOC 문자열이 계속된다고 가정합니다 (따라서 "예기치 않은 $ end"). 거의 모든 IDE와 구문 강조 편집기가이를 명확하게하거나 경고 할 것입니다.

이스케이프 된 따옴표

\문자열에 사용 하면 특별한 의미가 있습니다. 이를 " 이스케이프 문자 "라고하며 일반적으로 파서가 다음 문자를 문자 그대로 가져 오도록 지시합니다.

예 : echo 'Jim said \'Hello\'';인쇄Jim said 'hello'

문자열의 닫는 따옴표를 이스케이프하면 닫는 따옴표는 문자 그대로 취해지지 않습니다. 즉, 문자열의 일부로 인쇄 가능한 따옴표처럼 문자열을 닫지 않습니다. 다음 문자열을 열거 나 스크립트 끝에서 일반적으로 구문 분석 오류로 표시됩니다.

Windows에서 경로를 지정할 때 매우 일반적인 오류 : "C:\xampp\htdocs\"잘못되었습니다. 당신은 필요합니다 "C:\\xampp\\htdocs\\".

대체 구문

템플릿에서 명령문 / 코드 블록에 대체 구문을 사용할 때이 구문 오류가 발생하는 경우는 드 rare니다. 예를 들어 및 사용 if:및 else:누락 endif;.

또한보십시오:


14

예기치 않은 T_IF
예기치 않은 T_ELSEIF
예기치 않은 T_ELSE
예기치 않은 T_ENDIF

조건부 제어 블록 if, elseif및 else간단한 구조를 따릅니다. 구문 오류가 발생하면 대부분 잘못된 블록 중첩 → {중괄호 가 누락되었거나 }너무 많을 가능성이 큽니다 .

여기에 이미지 설명을 입력하십시오

  1. 누락 {또는 }잘못된 들여 쓰기 때문에

    일치하지 않는 코드 괄호는 다음과 같이 형식이 잘못된 코드에 일반적입니다.

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    코드가 다음과 같으면 새로 시작하십시오! 그렇지 않으면 그것은 당신이나 다른 사람에게 고칠 수 없습니다. 인터넷에 도움을 요청하기 위해 이것을 보여줄 필요는 없습니다.

    중첩 된 구조와 if / else 조건부 및 해당 {코드 블록의 관계를 시각적으로 따를 수있는 경우에만 수정할 수 있습니다 }. IDE를 사용하여 모두 페어링되어 있는지 확인하십시오.

    if (true) {
         if (false) {
                  …
         }
         elseif ($whatever) {
             if ($something2) {
                 …
             } 
             else {
                 …
             }
         }
         else {
             …
         }
         if (false) {    //   a second `if` tree
             …
         }
         else {
             …
         }
    }
    elseif (false) {
        …
    }

    모든 double } }은 분기를 닫을뿐만 아니라 이전 조건 구조를 닫습니다. 따라서 하나의 코딩 스타일을 고수하십시오. 중첩 된 if / else 트리에서 혼합하여 일치시키지 마십시오.

    여기서의 일관성 외에도 긴 조건을 피하는 것이 도움이됩니다. 읽을 수없는 if표현식 을 피하려면 임시 변수 또는 함수를 사용하십시오 .

  2. IF 표현식에 사용할 수 없습니다

    놀랍게도 자주 if오는 새로운 실수는 print 서술문과 같은 표현에서 서술문 을 사용하려고 합니다.

                       ⇓
    echo "<a href='" . if ($link == "example.org") { echo …

    물론 유효하지 않습니다.

    삼항 조건을 사용할 수 있지만 가독성에주의하십시오.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";

    그렇지 않으면 이러한 출력 구성을 분리하십시오. 여러 ifs 및 echos를 사용하십시오 .
    더 좋은 방법은 임시 변수를 사용 하고 다음과 같은 조건을 조건부 앞에 배치하는 것입니다.

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    그러한 경우에 함수 나 메소드를 정의하는 것도 종종 의미가 있습니다.

    제어 블록은 "결과"를 반환하지 않습니다

    이제는 일반적이지 않지만 일부 코더 if는 결과를 반환 할 수있는 것처럼 취급하려고합니다 .

    $var = if ($x == $y) { "true" };

    if문자열 연결 / 표현식 내 에서 사용 하는 것과 구조적으로 동일합니다 .

    • 그러나 제어 구조 (if / foreach / while)에는 "결과" 가 없습니다 .
    • 리터럴 문자열 "true"도 void 문일뿐입니다.

    코드 블록에서 할당을 사용해야합니다 .

    if ($x == $y) { $var = "true"; }

    또는 ?:삼항 비교에 의지하십시오 .

    만약에 만약에

    당신은 할 수 없습니다 둥지if 중 하나의 조건 내에서 :

                        ⇓
    if ($x == true and (if $y != false)) { ... }

    and(또는 or)는 이미 체인 비교를 허용 하기 때문에 분명히 중복 됩니다.

  3. 잊혀진 ;세미콜론

    한 번 더 : 각 제어 블록은 명령문이어야합니다. 이전 코드 조각이 세미콜론으로 끝나지 않으면 구문 오류가 보장됩니다.

                    ⇓
    $var = 1 + 2 + 3
    if (true) { … }

    Btw, {…}코드 블록 의 마지막 줄 에는 세미콜론도 필요합니다.

  4. 세미콜론이 너무 일찍

    이 함정을 간과하기가 쉽지 않기 때문에 특정 코딩 스타일을 비난하는 것은 아마도 잘못된 것입니다.

                ⇓
    if ($x == 5);
    {
        $y = 7;
    }
    else           ←
    {
        $x = -1;    
    }

    생각보다 자주 발생합니다.

    • 표현식 을 종료하면if (); void 문이 실행됩니다. 는 ;빈되고 {}자신의!
    • 따라서 {…}블록은에서 분리되어 if항상 실행됩니다.
    • 따라서 else더 이상 개방 if구조와 관련이 없으므로 예기치 않은 T_ELSE 구문 오류가 발생합니다.

    이 구문 오류의 미묘한 변형도 설명합니다.

    if ($x) { x_is_true(); }; else { something_else(); };

    어디 ;코드 후 블록은 {…}전체 종료 if , 절단, 구조를 else구문 지점을.

  5. 코드 블록을 사용하지 않음

    구문 중괄호를 생략 할 수있어 {... }코드 블록에 대한 if/ elseif/ else분기합니다. 슬프게도 비 유행 코더에게 공통적 인 구문 스타일은 무엇입니까? (잘못된 가정 하에서 입력하거나 읽는 것이 더 빠릅니다).

    그러나 그것은 구문을 넘어 뜨릴 가능성이 높습니다. 조만간 추가 진술은 if / else 분기로 향할 것입니다.

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     ←
    else
        $z = 0;

    실제로 코드 블록을 사용하려면, 당신은 해야합니까 쓰기에 {... }같은 그들!

    노련한 프로그래머조차도이 중괄호없는 구문을 피하거나 최소한 예외적 인 예외로 이해해야합니다.

  6. 잘못된 순서로 Else / Elseif

    자신을 생각 나게하는 것은 물론 조건적인 순서 입니다.

    if ($a) { … }
    else { … }
    elseif ($b) { … }
    ↑

    elseif원하는만큼을 가질 수 있지만 else마지막으로 가야 합니다. 그것이 바로 그 방법입니다.

  7. 클래스 선언

    마찬가지로 위에서 언급 한 , 당신은 클래스 선언에서 제어 명령을 가질 수 없습니다 :

    class xyz {
        if (true) {
            function ($var) {}
        }

    함수 정의 를 잊었 거나 }그러한 경우 너무 일찍 닫았습니다 .

  8. 예기치 않은 T_ELSEIF / T_ELSE

    PHP와 HTML을 혼합하는 경우, 폐쇄 }에 대한이 if/elseif같은 PHP 블록에 있어야합니다 <?php ?>다음과 같은 elseif/else. 이것에 대한 종결 }은 다음의 if일부가 될 때 오류가 발생 합니다 elseif.

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    올바른 양식 <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    이것은 부정확 한 들여 쓰기의 변형입니다 – 아마도 종종 잘못된 코딩 의도에 근거합니다. 토큰 과 / 토큰 사이에 다른 문장을 매시
    할 수 없습니다 : ifelseifelse

    if (true) {
    }
    echo "in between";    ←
    elseif (false) {
    }
    ?> text <?php      ←
    else {
    }

    {…}제어 구조 토큰 사이가 아닌 코드 블록 에서만 발생할 수 있습니다 .

    • 어쨌든 이것은 의미가 없습니다. PHP가 분기 if와 else분기 사이를 이동할 때 "정의되지 않은"상태가있는 것은 아닙니다 .
    • 인쇄 문이 어디에 있는지 또는 두 분기에서 반복해야 하는지를 염두에 두어야합니다.

    다른 제어 구조 사이에 if / else를 나눌 수도 없습니다 .

    foreach ($array as $i) {
        if ($i) { … }
    }
    else { … }

    더 없다 통 사적 관계 사이 if및 else. foreach에서 어휘 범위의 끝 }, 그래서에 대한 포인트가 없습니다 if구조를 계속합니다.

  9. T_ENDIF

    예기치 않은 T_ENDIF에 대해 불만이있는 경우 대체 구문 스타일 if:⋯ elseif:⋯ else:⋯을 사용하고 endif;있습니다. 정말 두 번 생각해야합니다.

    • 일반적인 함정은 세미콜론에 대한 엄청나게 비슷한 :결장을; 혼동하고 있습니다. ( "세미콜론이 너무 빠르다"

    • 들여 쓰기는 템플릿 파일에서 추적하기가 더 어려우므로 대체 구문을 사용할 때 더 많이 endif;일치합니다 if:.

    • 사용 } endif; 은 이중 if 종결 자입니다.

    "예기치 못한 $ end"는 일반적으로 잊혀진 닫는 }중괄호 의 가격입니다 .

  10. 과제와 비교

    따라서 이것은 구문 오류가 아니지만이 맥락에서 언급 할 가치가 있습니다.

           ⇓
    if ($x = true) { }
    else { do_false(); }

    그것은 ==/ ===비교가 아니라 =할당 입니다. 이것은 다소 미묘하며 일부 사용자가 쉽게 전체 조건 블록을 편집하도록 이끌 것입니다. 의도하지 않은 할당을 먼저 살펴보십시오. 로직 오류 / 오작동이 발생할 때마다.


11

예상치 못한 T_IS_EQUAL
예기치 예기치 않은 T_IS_IDENTICAL
예기치 않은 T_IS_NOT_EQUAL
예기치 않은 T_IS_NOT_IDENTICAL
예기치 않은 T_IS_SMALLER_OR_EQUAL
예기치 않은 T_IS_SMALLER_OR_EQUAL
예기치 <
않은 예상>

비교 연산자 등 ==, >=, ===, !=,<> , !==및 <=또는 <과 >대부분 같은 단지 표현에 사용되어야 if표현. 파서가 그들에 대해 불평하면 종종 파싱이 틀리거나 일치하지 않는 ( )파렌을 의미 합니다.

  1. 파 렌스 그룹화

    특히 if다중 비교 가 포함 된 명령문의 경우 여는 괄호와 닫는 괄호 를 올바르게 계산하도록주의해야합니다 .

                            ⇓
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          ↑

    여기서 여기의 if조건은 이미)

    비교가 충분히 복잡해지면 종종 여러 개의 중첩 된 if구조 로 나누는 데 도움이됩니다 .

  2. isset () 비교와 으깬

    pitfal이 결합 isset()하거나empty() 비교 과 같습니다.

                            ⇓
    if (empty($_POST["var"] == 1)) {

    또는:

                        ⇓
    if (isset($variable !== "value")) {

    PHP에는 이치에 맞지 않습니다. isset 및 empty유일한 변수 이름을 허용 언어 구조이다. 출력이 부울 일 뿐이므로 이미 결과를 비교하는 것은 의미가 없습니다.

  3. 혼란스러운 >= 과 이상을 또는 동등 =>배열 연산자

    두 연산자는 다소 비슷해 보이므로 때때로 혼동됩니다

             ⇓
    if ($var => 5) { ... }

    이 비교 연산자는 " 보다 큼 올바르게 사용하려면 거나 같음 " 하면됩니다.

    또한보십시오: PHP에서 If 문 구조

  4. 비교할 것이 없습니다

    동일한 변수 이름과 관련된 두 비교를 결합 할 수도 없습니다.

                     ⇓
    if ($xyz > 5 and < 100)

    PHP는 초기 변수를 다시 비교할 것이라고 추론 할 수 없습니다. 표현식은 일반적으로 연산자 우선 순위 에 따라 쌍을 이룹니다 .< 볼 까지 원래 변수에서 부울 결과 만 남습니다.

    참조 : 예기치 않은 T_IS_SMALLER_OR_EQUAL

  5. 비교 체인

    연산자 행이있는 변수와 비교할 수 없습니다.

                      ⇓
     $reult = (5 < $x < 10);

    이것은 각각에 대한 두 가지 비교로 나뉩니다 $x.

    이는 실제로 등가 연산자 연관성으로 인해 블랙리스트 표현식의 경우입니다. 몇 가지 C 스타일 언어에서는 구문 적으로 유효하지만 PHP는 예상되는 비교 체인으로 해석하지 않습니다.

  6. 예기치 않은 >
    않은 않은<

    보다 크 >거나 작은 <연산자에는 사용자 정의 T_XXX토크 나이저 이름 이 없습니다 . 그리고 그것들은 다른 사람들처럼 잘못 배치 될 수 있지만 파서가 잘못 인용 된 문자열과 으깬 HTML에 대해 불평하는 경우가 더 많습니다.

                            ⇓
    print "<a href='z">Hello</a>";
                     ↑

    이것은 문자열 "<a href='z"이 >리터럴 상수 Hello와 <비교 된 다음 다른 비교에 해당합니다. 또는 적어도 PHP가 보는 방식입니다. 실제 원인과 구문 실수는 조기 문자열 "종료였습니다.

    PHP 시작 태그를 중첩 할 수도 없습니다 :

    <?php echo <?php my_func(); ?>
               ↑

또한보십시오:


11

예기치 않은 T_IF
예기치 않은 T_FOREACH
예기치 않은 T_FOR
예기치 않은 T_WHILE
예기치 않은 T_DO
예기치 않은 T_ECHO

컨트롤은이 같은 구축 if, foreach, for, while, list, global, return, do, print, echo문에만 사용할 수있다. 그들은 대개 혼자서 줄에 있습니다.

  1. 세미콜론; 어디 있니?

    파서가 제어문에 대해 불평하면 이전 줄에서 세미콜론 을 놓친 적이 있습니다 .

                 ⇓
    $x = myfunc()
    if (true) {

    해결책 : 이전 줄을 살펴보십시오. 세미콜론을 추가하십시오.

  2. 클래스 선언

    이것이 발생하는 또 다른 위치 는 클래스 선언 입니다. 클래스 섹션에는 속성 초기화 및 메서드 섹션 만 나열 할 수 있습니다. 코드가있을 수 없습니다.

    class xyz {
        if (true) {}
        foreach ($var) {}

    이러한 구문 오류는 일반적으로 잘못 중첩 된 {및 }. 특히 함수 코드 블록이 너무 일찍 닫 혔을 때.

  3. 표현 문맥에서의 진술

    대부분의 언어 구성은 문장으로 만 사용할 수 있습니다 . 그것들은 다른 표현 안에 배치되어서는 안됩니다 :

                       ⇓
    $var = array(1, 2, foreach($else as $_), 5, 6);

    마찬가지로 ifin 문자열, 수학 표현식 또는 다른 곳 을 사용할 수 없습니다 .

                   ⇓
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    삽입을 위해 if특별히 표현식에서 -like 조건을, 당신은 종종 사용할 ?:삼항 평가 .

    동일 적용 for, while, global, echo그리고 낮은 확장 list.

              ⇓
    echo 123, echo 567, "huh?";

    반면 print()에 표현 컨텍스트에서 사용될 수있는 언어가 내장되어 있습니다. (그러나 거의 말이되지 않습니다.)

  4. 식별자로 예약 된 키워드

    또한 사용자 정의 함수 또는 클래스 이름에 대해 do또는 if다른 언어 구문을 사용할 수 없습니다 . (아마도 PHP 7에서는 가능하지만 권장하지는 않습니다.)


7

예기치 않은 '?'

??PHP 7 이전의 PHP 버전에서 null 병합 연산자를 사용하려고 하면이 오류가 발생합니다.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

예상치 못한 '?', 변수 예상

다음과 같이 널 입력 가능 유형에 대해 유사한 오류가 발생할 수 있습니다.

function add(?int $sum): ?int {

이것은 다시 오래된 PHP 버전이 사용되고 있음을 나타냅니다 (CLI 버전 php -v또는 웹 서버에 바인딩 된 버전 phpinfo();).


5

예기치 않은 T_LNUMBER

토큰 T_LNUMBER은 "긴"/ 숫자를 나타냅니다.

  1. 유효하지 않은 변수 이름

    PHP 및 대부분의 다른 프로그래밍 언어에서 변수 는 숫자로 시작할 수 없습니다. 첫 문자는 알파벳 또는 밑줄이어야합니다.

    $1   // Bad
    $_1  // Good

    *

    • PHP 컨텍스트에서 -placeholders 를 사용하는 경우 가 종종 있습니다 .preg_replace"$1"

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

      콜백이 인용 된 곳 (이제 /e정규 표현식 플래그는 더 이상 사용되지 않습니다. 그러나 때때로 preg_replace_callback함수 에서 여전히 잘못 사용됩니다 .)

    • 동일한 식별자 제약 조건이 객체 속성 btw에 적용됩니다 .

             ↓
      $json->0->value
    • 토크 나이 / 파서가 문자를 허용하지 않지만 $1변수 이름을, 하나는 수 사용 ${1}또는 ${"1"}. 비표준 식별자에 대한 구문 해결 방법입니다. (로컬 스코프 조회로 생각하는 것이 가장 좋습니다. 그러나 일반적으로 그러한 경우에는 일반 배열을 선호합니다!)

    • 재미 있지만 권장하지는 않지만 PHP 파서는 유니 코드 식별자를 허용합니다. 그러한 그 $➊유효 할 것이다. (리터럴과 달리 1).

  2. 스트레이 배열 항목

    쉼표 가없는 경우 배열 선언에 예기치 않은 시간이 발생할 수 있습니다 ,.

    #            ↓ ↓
    $xy = array(1 2 3);

    또는 마찬가지로 함수 호출 및 선언 및 기타 구성 :

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    따라서 일반적으로 목록 또는 표현식을 분리하기 위해 하나 ;또는 ,누락되었습니다.

  3. 잘못 인용 된 HTML

    그리고 다시, 잘못 인용 된 문자열 은 빈번한 숫자의 소스입니다 :

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    이러한 경우는 예기치 않은 T_STRING 오류 와 비슷하거나 덜 취급되어야 합니다.

  4. 다른 식별자

    함수, 클래스 또는 네임 스페이스 는 숫자로 시작하여 이름을 지정할 수 없습니다.

             ↓
    function 123shop() {

    변수 이름과 거의 동일합니다.


2

예기치 않은 '='

변수 이름에 유효하지 않은 문자가 있으면 발생할 수 있습니다. 변수 이름 은 다음 규칙을 따라야합니다.

변수 이름은 PHP의 다른 레이블과 동일한 규칙을 따릅니다. 유효한 변수 이름은 문자 또는 밑줄로 시작하고 그 뒤에 여러 문자, 숫자 또는 밑줄이옵니다. 정규식으로 다음과 같이 표현됩니다. '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


좋은 추가 존.
— Funk Forty Niner

1

예기치 않은 '계속'(T_CONTINUE)

continue는 성명서 (예 : for 또는 if)이며 독립형으로 표시되어야합니다. 표현식의 일부로 사용할 수 없습니다. continue는 값을 반환하지 않지만 표현식에서 모든 하위 표현식은 일부 값을 가져 와서 전체 표현식이 값을 가져야합니다. 이것이 진술과 표현의 차이입니다.

이는 continue3 진 명령문 또는 리턴 값이 필요한 명령문에 사용될 수 없음을 의미 합니다.

예상치 못한 '휴식'(T_BREAK)

break;물론 마찬가지입니다 . 표현식 컨텍스트에서는 사용할 수 없지만 엄격한 문장 ( foreach또는 동일한 레벨 또는 if블록)에서 사용할 수 있습니다.

예기치 않은 '반품'(T_RETURN)

이제 이것은 더 놀라운 return일이지만, 그것은 또한 블록 수준의 진술 이기도 합니다 . 더 높은 범위 / 함수에 값 (또는 NULL)을 반환하지만 식 자체로 평가되지는 않습니다. → 즉 : 아무 소용이 없습니다return(return(false);;


1

예기치 않은 '.'

지원되지 않는 PHP 버전에서 splat 연산자 ( ...) 를 사용하려는 경우에 발생할 수 있습니다 .

... PHP 5.6에서 처음으로 함수에 대한 다양한 개수의 인수를 캡처 할 수있게되었습니다.

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

PHP 7.4에서는 배열 표현식에 사용할 수 있습니다 .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

0

예기치 않은 '종료'(T_ENDWHILE)

구문은 콜론을 사용하고 있습니다. 콜론이 없으면 위의 오류가 발생합니다.

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

이 구문의 대안은 중괄호를 사용하는 것입니다.

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php


0

오류 코드 Parse error: syntax error, unexpected ':'는 클래스 정적 참조 Class::$Variable를 실수로로 작성하여 발생할 수 있습니다 Class:$Variable.

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