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

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

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

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

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

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

밀접한 관련 참조 :

과:

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

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

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


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



답변

구문 오류는 무엇입니까?

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 살펴 보는 데 도움이됩니다 .


답변

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

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

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

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

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

답변

예기치 않은 [

요즘 예기치 않은 [배열 괄호는 오래된 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에서 브래킷 일치를 사용하여 조기 ]어레이 클로저 를 찾으십시오 . 최소한 더 많은 간격과 줄 바꾸기를 사용하여 좁히십시오.


답변

예상치 못한 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를 확인하십시오.

또한보십시오


답변

예기치 않은 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는 서로 직접적으로 따르는 두 개의 문자열 리터럴에 대해 불평합니다. 그러나 실제 원인은 닫히지 않은 이전 문자열입니다.

또한보십시오


답변

예기치 않은 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\\".


답변

예기치 않은 (

여는 괄호는 일반적으로 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등에 대해서도 마찬가지입니다 .

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