질문 : PHP 구문 분석 / 구문 오류; 그리고 그것들을 해결하는 방법
누구나 구문 오류가 발생합니다. 경험 많은 프로그래머조차도 오타를 만듭니다. 신규 이민자에게는 학습 과정의 일부일뿐입니다. 그러나 다음과 같은 오류 메시지를 해석하기 쉬운 경우가 많습니다.
PHP 구문 분석 오류 : 구문 오류, 20 행의 index.php에서 예기치 않은 '{'
예상치 못한 기호가 항상 진짜 범인은 아닙니다. 그러나 줄 번호는 어디에서 검색을 시작할지 대략적인 아이디어를 제공합니다.
항상 코드 컨텍스트를 확인하십시오 . 구문 오류는 종종 언급 된 코드 나 이전 코드 줄 에 숨겨져 있습니다. 코드를 매뉴얼의 구문 예제와 비교하십시오.
모든 경우가 다른 경우와 일치하지는 않습니다. 그러나 구문 오류를 해결하기위한 몇 가지 일반적인 단계가 있습니다. 이 참조는 일반적인 함정을 요약했습니다.
- Unexpected T_STRING
- Unexpected T_VARIABLE
Unexpected '$varname' (T_VARIABLE) - Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE - Unexpected $end
- Unexpected T_FUNCTION…
- Unexpected {
Unexpected }
Unexpected (
Unexpected ) - Unexpected [
Unexpected ] - Unexpected T_IF
Unexpected T_FOREACH
Unexpected T_FOR
Unexpected T_WHILE
Unexpected T_DO
Unexpected T_PRINT
Unexpected T_ECHO - Unexpected T_LNUMBER
- Unexpected ?
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN) - Unexpected '='
- Unexpected T_INLINE_HTML…
- Unexpected T_PAAMAYIM_NEKUDOTAYIM…
- Unexpected T_OBJECT_OPERATOR…
- Unexpected T_DOUBLE_ARROW…
- Unexpected T_SL…
- Unexpected T_BOOLEAN_OR…
Unexpected T_BOOLEAN_AND… - Unexpected T_IS_EQUAL
Unexpected T_IS_GREATER_OR_EQUAL
Unexpected T_IS_IDENTICAL
Unexpected T_IS_NOT_EQUAL
Unexpected T_IS_NOT_IDENTICAL
Unexpected T_IS_SMALLER_OR_EQUAL
Unexpected <
Unexpected > - Unexpected T_NS_SEPARATOR…
- Unexpected character in input: '\' (ASCII=92) state=1
- Unexpected 'public' (T_PUBLIC)
Unexpected 'private' (T_PRIVATE)
Unexpected 'protected' (T_PROTECTED)
Unexpected 'final' (T_FINAL)… - Unexpected T_STATIC…
- Unexpected T_CLASS…
- Unexpected 'use' (T_USE)
- Unexpected T_DNUMBER
- Unexpected , (comma)
- Unpexected . (period)
- Unexpected ; (semicolon)
- Unexpected * (asterisk)
- Unexpected : (colon)
- Unexpected ':', expecting ',' or ')'
- Unexpected & (call-time pass-by-reference)
- Unexpected .
밀접하게 관련된 참조 :
그리고
- php.net의 PHP 매뉴얼 과 다양한 언어 토큰
- 또는 PHP에 대한 Wikipedia의 구문 소개.
- 그리고 마지막으로 PHP 태그 위키 입니다.
Stack Overflow는 신참 코더도 환영하지만 대부분 전문 프로그래밍 질문을 대상으로합니다.
- 모든 사람의 코딩 실수와 좁은 오타에 대답하는 것은 대부분 주제에서 벗어난 것으로 간주됩니다.
- 따라서 구문 수정 요청을 게시하기 전에 시간을내어 기본 단계를 따르십시오.
- 그래도 해결해야한다면 자신의 해결 이니셔티브, 시도한 수정 사항, 무엇이 잘못되었거나 잘못되었는지에 대한 사고 과정을 보여주세요.
브라우저에 "SyntaxError : illegal character"와 같은 오류 메시지가 표시되면 실제로는 php 관련이 아니라 javascript 구문 오류 입니다.
공급 업체 코드에서 발생하는 구문 오류 : 마지막으로 코드베이스를 편집하여 구문 오류가 발생하지 않았지만 외부 공급 업체 패키지 설치 또는 업그레이드 후 PHP 버전 비 호환성 때문일 수 있으므로 플랫폼에 대한 공급 업체의 요구 사항을 확인하십시오. 설정.
답변
PHP는 C 스타일 및 명령형 프로그래밍 언어에 속합니다. 엄격한 문법 규칙을 가지고있어서 잘못 배치 된 기호 나 식별자를 발견했을 때 복구 할 수 없습니다. 코딩 의도를 추측 할 수 없습니다.
항상 취할 수있는 몇 가지 기본 예방 조치가 있습니다.
- 적절한 코드 들여 쓰기를 사용하거나 높은 코딩 스타일을 채택하십시오. 가독성은 불규칙성을 방지합니다.
- 구문 강조가있는 PHP 용 IDE 또는 편집기를 사용합니다. 괄호 / 대괄호 균형 조정에도 도움이됩니다.
- 매뉴얼의 언어 참조 및 예제를 읽으십시오. 어느 정도 능숙 해지려면 두 번.
일반적인 구문 오류 메시지는 다음과 같습니다.
구문 분석 오류 : 구문 오류, 예기치 않은 T_STRING , 예상 ' ;
' file.php의 217 행
구문 오류 의 가능한 위치를 나열합니다. 언급 된 파일 이름 과 줄 번호를 참조하십시오.
T_STRING
과 같은 모니 커 는 파서 / 토케 나이저가 최종적으로 처리 할 수없는 기호를 설명합니다. 그러나 이것이 반드시 구문 오류의 원인은 아닙니다.
이전 코드 라인 도 살펴 보는 것이 중요합니다. 종종 구문 오류는 이전에 발생한 사고 일뿐입니다. 오류 줄 번호는 파서가 모든 처리를 결정적으로 포기한 곳입니다.
구문 문제를 좁히고 수정하는 방법에는 여러 가지가 있습니다.
- 언급 된 소스 파일을 엽니 다. 언급 된 코드 라인을보십시오 .
- 폭주 문자열 및 잘못 배치 된 연산자의 경우 일반적으로 여기에서 범인을 찾습니다.
- 왼쪽에서 오른쪽으로 줄을 읽고 각 기호가 무엇을하는지 상상하십시오.
- 보다 정기적으로 선행 줄 도 살펴볼 필요가 있습니다.
- 특히, 누락
;
이전 줄 끝 / 문에 세미콜론이 없습니다. (적어도 문체 적 관점에서는.) {
코드 블록}
이 잘못 닫히거나 중첩 된 경우 소스 코드를 더 자세히 조사해야 할 수 있습니다. 이를 단순화하려면 적절한 코드 들여 쓰기를 사용하십시오.
- 특히, 누락
- 구문 색상 화를 보십시오!
- 문자열과 변수, 상수는 모두 다른 색을 가져야합니다.
- 연산자
+-*/.
색도 뚜렷해야합니다. 그렇지 않으면 잘못된 컨텍스트에있을 수 있습니다. - 문자열 색상 화가 너무 멀리 또는 너무 짧게 확장되면 이스케이프 처리되지 않았거나 닫는
"
또는'
문자열 마커가 누락 된 것입니다. - 같은 색의 두 문장 부호가 나란히 있으면 문제가 될 수 있습니다. 일반적으로 연산자는
++
,--
또는 연산자 뒤의 괄호가 아니면 혼자입니다. 서로 바로 뒤 따르는 두 개의 문자열 / 식별자는 대부분의 컨텍스트에서 올바르지 않습니다.
- 공백은 당신의 친구 입니다. 어떤 코딩 스타일을 따르십시오.
- 긴 줄을 일시적으로 끊습니다.
- 연산자 또는 상수와 문자열 사이에 자유롭게 줄 바꿈을 추가 할 수 있습니다. 그런 다음 구문 분석기는 구문 분석 오류에 대한 행 번호를 구체화합니다. 매우 긴 코드를 보는 대신 누락되거나 잘못 배치 된 구문 기호를 분리 할 수 있습니다.
if
문을 개별 또는 중첩if
조건으로 분할합니다.- 긴 수학 공식이나 논리 체인 대신 임시 변수를 사용하여 코드를 단순화하십시오. (더 읽기 쉬움 = 오류 감소)
- 다음 사이에 줄 바꿈 추가 :
- 정확한 것으로 쉽게 식별 할 수있는 코드,
- 확실하지 않은 부분,
- 그리고 파서가 불평하는 줄.
- 문제가되는 코드를 주석 처리하십시오.
- 문제 소스를 분리 할 수없는 경우 코드 블록을 주석 처리 (따라서 일시적으로 제거)하십시오.
- 구문 분석 오류를 제거하자마자 문제의 원인을 찾은 것입니다. 더 자세히보세요.
- 때때로 완전한 함수 / 방법 블록을 일시적으로 제거하고 싶을 때가 있습니다. (일치하지 않는 중괄호와 잘못 들여 쓴 코드의 경우)
- 구문 문제를 해결할 수없는 경우 주석 처리 된 섹션 을 처음부터 다시 작성 하십시오.
- 초보자로서 혼란스러운 구문 구조를 피하십시오.
- 삼항
? :
조건 연산자는 코드를 압축 할 수 있으며 실제로 유용합니다. 그러나 모든 경우에 가독성에 도움이되는 것은 아닙니다.if
동안 일반 if 문을 선호하십시오. - PHP의 대체 구문 (
if:
/elseif:
/endif;
)은 템플릿에 일반적이지만 일반적인{
code}
블록보다 따르기가 쉽지 않습니다.
- 삼항
- 가장 널리 알려진 새로운 실수는 다음과 같습니다.
- 세미콜론이 없습니다
;
문 / 줄을 종료합니다. "
또는'
대해 일치하지 않는 문자열 따옴표와 이스케이프 처리되지 않은 따옴표가 있습니다.- 잊혀진 연산자, 특히 문자열
.
연쇄. - 불균형
(
괄호)
. 보고 된 줄에서 세십시오. 같은 수가 있습니까?
- 세미콜론이 없습니다
- 하나의 구문 문제를 해결하면 다음 문제를 발견 할 수 있다는 것을 잊지 마십시오.
- 한 가지 문제를 해결하고 아래 코드에서 다른 문제가 발생하면 대부분 올바른 경로에있는 것입니다.
- 새 구문을 편집 한 후 오류가 같은 줄에 나타나면 변경 시도가 실패했을 수 있습니다. (항상 그런 것은 아닙니다.)
- 수정할 수없는 경우 이전에 작동했던 코드의 백업을 복원합니다.
- 소스 코드 버전 관리 시스템을 채택하십시오. 언제든 중단 된 버전과 마지막 작업 버전
diff
를 볼 수 있습니다. 구문 문제가 무엇인지 알 수 있습니다.
- 소스 코드 버전 관리 시스템을 채택하십시오. 언제든 중단 된 버전과 마지막 작업 버전
- 보이지 않는 길잃은 유니 코드 문자 : 경우에 따라 소스에서 16 진 편집기 또는 다른 편집기 / 뷰어 를 사용해야합니다. 코드를 보는 것만으로는 일부 문제를 찾을 수 없습니다.
- ASCII가 아닌 기호를 찾기위한 첫 번째 방법으로
grep --color -P -n "\[\x80-\xFF\]" file.php
를 사용해보십시오. - 특히 BOM, 너비가 0 인 공백 또는 끊기지 않는 공백 및 스마트 따옴표는 정기적으로 소스 코드로 들어갈 수 있습니다.
- ASCII가 아닌 기호를 찾기위한 첫 번째 방법으로
- 어떤 유형의 줄 바꿈 이 파일에 저장되는지 확인하십시오.
- PHP 단지 명예 \ n 줄 바꿈하지 \ r에 캐리지 리턴.
- MacOS 사용자에게는 때때로 문제가됩니다 (잘못 구성된 편집기의 경우 OS X에서도).
//
또는#
주석이 사용되는 경우에만 종종 문제가됩니다. 여러 줄/*...*/
주석은 줄 바꿈이 무시 될 때 파서를 거의 방해하지 않습니다.
- 구문 오류가 웹을 통해 전송되지 않는 경우 : 컴퓨터에 구문 오류가있는 것입니다. 그러나 동일한 파일을 온라인에 게시해도 더 이상 표시되지 않습니다. 다음 두 가지 중 하나만 의미 할 수 있습니다.
- 잘못된 파일을보고 있습니다!
- 또는 코드에 보이지 않는 길잃은 유니 코드가 포함되어 있습니다 (위 참조). 쉽게 찾을 수 있습니다. 웹 양식에서 텍스트 편집기로 코드를 다시 복사하면됩니다.
- PHP 버전을 확인하십시오. 모든 서버에서 모든 구문 구조를 사용할 수있는 것은 아닙니다.
- 명령 줄 인터프리터의 경우
php -v
<?php phpinfo();
웹 서버를 통해 호출되는 경우.
그것들은 반드시 동일하지는 않습니다. 특히 프레임 워크로 작업 할 때 프레임 워크를 일치시킬 것입니다. - 명령 줄 인터프리터의 경우
- PHP의 예약 키워드 를 함수 / 메서드, 클래스 또는 상수에 대한 식별자로 사용하지 마십시오.
- 시행 착오는 마지막 수단입니다.
다른 모든 방법이 실패하면, 당신은 항상 당신의 오류 메시지가 구글 수 있습니다. 구문 기호는 검색하기가 쉽지 않습니다 (Stack Overflow 자체는 SymbolHound에 의해 색인화됩니다). 따라서 관련성을 찾기 전에 몇 페이지를 더 검토해야 할 수도 있습니다.
추가 가이드 :
- David Sklar의 PHP 디버깅 기초
- Jason McCreary의 PHP 오류 수정
- PHP 오류 – Mario Lurig의 10 가지 일반적인 실수
- 일반적인 PHP 오류 및 솔루션
- WordPress 웹 사이트 문제를 해결하고 수정하는 방법
- 디자이너를위한 PHP 오류 메시지 안내 -Smashing Magazine
웹 사이트가 비어있는 경우 일반적으로 구문 오류가 원인입니다. 다음을 사용하여 디스플레이 활성화 :
error_reporting = E_ALL
display_errors = 1
일반적으로 php.ini
에서 또는 mod_php의 경우 .htaccess
를 통해 또는 FastCGI 설정을 사용하는 .user.ini
PHP가 첫 번째 줄을 해석 / 실행할 수 없기 때문에 깨진 스크립트 내에서 활성화하는 것은 너무 늦습니다. test.php
같이 래퍼 스크립트를 만드는 것입니다.
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
그런 다음이 래퍼 스크립트에 액세스하여 실패한 코드를 호출합니다.
또한 스크립트가 HTTP 500 응답과 충돌 할 때 error_log
를 활성화하고 웹 서버의 error.log
살펴 보는 데 도움이됩니다.
출처 : https://stackoverflow.com/questions/18050071/php-parse-syntax-errors-and-how-to-solve-them
'프로그래밍 언어 > PHP' 카테고리의 다른 글
PHP를 사용하여 현재 연도를 얻는 방법 (0) | 2021.08.13 |
---|---|
value 로 PHP 배열 삭제 (key 아님) (0) | 2021.08.12 |
PHP의 배열에서 요소 삭제 (0) | 2021.08.11 |
PHP에서 thread safe 또는 on-thread safe (0) | 2021.08.10 |
PHP의 모든 위치에 배열에 새 항목 삽입 (0) | 2021.08.09 |