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 forforeachstatement에 대한 여는 괄호 또는 닫는 괄호를 잊을 수 있습니다 .

           
    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_STRINGT_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, elseifelse간단한 구조를 따릅니다. 구문 오류가 발생하면 대부분 잘못된 블록 중첩 → {중괄호 가 누락되었거나 }너무 많을 가능성이 큽니다 .

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

  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가 분기 ifelse분기 사이를 이동할 때 "정의되지 않은"상태가있는 것은 아닙니다 .
    • 인쇄 문이 어디에 있는지 또는 두 분기에서 반복해야 하는지를 염두에 두어야합니다.

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

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

    더 없다 통 사적 관계 사이 ifelse. 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에는 이치에 맞지 않습니다. issetempty유일한 변수 이름을 허용 언어 구조이다. 출력이 부울 일 뿐이므로 이미 결과를 비교하는 것은 의미가 없습니다.

  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.