[php] PHP 파싱 / 구문 에러; 그리고 그것들을 해결하는 방법
누구나 구문 오류가 발생합니다. 숙련 된 프로그래머조차도 오타를 만듭니다. 새로 온 사람들에게는 학습 과정의 일부일뿐입니다. 그러나 종종 다음과 같은 오류 메시지를 해석하기가 쉽습니다.
PHP 구문 분석 오류 : 구문 오류, 20 행의 index.php에 예기치 않은 ‘{‘
예상치 못한 상징이 항상 진정한 범인은 아닙니다. 그러나 줄 번호는 어디서부터 시작해야하는지 대략적으로 알 수 있습니다.
항상 코드 컨텍스트를보십시오 . 구문 실수는 종종 언급 된 또는 이전 코드 라인 에서 숨겨 집니다 . 코드를 매뉴얼의 구문 예제와 비교하십시오.
모든 사례가 다른 사례와 일치하는 것은 아닙니다. 그러나 구문 오류 를 해결하기위한 일반적인 단계가 있습니다. 이 참고 문헌은 일반적인 함정을 요약했습니다.
-
예기치 않은 T_CONSTANT_ENCAPSED_STRING
예기치 않은 T_ENCAPSED_AND_WHITESPACE -
예기치 않은 T_IF
예기치 않은 T_FOREACH
예기치 않은 T_FOR
예기치 않은 T_WHILE
예기치 않은 T_DO
예기치 않은 T_PRINT
예기치 않은 T_ECHO -
예기치 않은 계속 (T_CONTINUE)
예기치 않은 계속 (T_BREAK)
예기치 않은 계속 (T_RETURN) -
예기치 않은 ‘공개'(T_PUBLIC)
예기치 않은 ‘개인'(T_PRIVATE)
예기치 않은 ‘보호'(T_PROTECTED)
예기치 않은 ‘최종'(T_FINAL) … -
예기치 않은
,
(쉼표) -
미결 점
.
(기간) -
예상치 못한
;
(세미콜론) -
예기치 않은
*
(별표) -
예기치 않은
:
(콜론) -
예상치 못한
&
(통화 시간 통과 기준)
밀접한 관련 참조 :
과:
Stack Overflow는 신인 코더도 환영하지만 전문 프로그래밍 문제를 주로 목표로합니다.
- 모든 사람의 코딩 실수와 좁은 오타에 답하는 것은 대부분 논외로 간주됩니다.
- 구문 수정 요청을 게시하기 전에 기본 단계 를 따르십시오 .
- 그래도 문제가 해결되지 않으면 자신의 해결 이니셔티브, 시도한 수정 사항 및 생각 과정을 보여 주거나 잘못되었을 수있는 사항에 대해 알려주십시오.
브라우저에 “SyntaxError : illegal character”와 같은 오류 메시지가 표시 되면 실제로는 그렇지 않습니다PHP관련이 있지만 자바 스크립트– 구문 오류 .
공급 업체 코드에서 발생하는 구문 오류 : 마지막으로, 코드베이스를 편집하여 구문 오류가 발생하지 않았지만 외부 공급 업체 패키지 설치 또는 업그레이드 후 PHP 버전 비 호환성으로 인한 것일 수 있으므로 플랫폼에 대한 공급 업체 요구 사항을 확인하십시오. 설정.
답변
구문 오류는 무엇입니까?
PHP는 C 스타일 및 명령형 프로그래밍 언어에 속합니다 . 엄격한 문법 규칙이있어 잘못 배치 된 기호 나 식별자가 발견 될 때 복구 할 수 없습니다. 코딩 의도를 추측 할 수 없습니다.
가장 중요한 팁
항상 취할 수있는 몇 가지 기본 예방책이 있습니다.
-
적절한 코드 들여 쓰기를 사용 하거나 높은 코딩 스타일을 채택하십시오. 가독성은 불규칙성을 방지합니다.
-
구문 강조 와 함께 PHP 용 IDE 또는 편집기를 사용하십시오 . 괄호 / 브래킷 밸런싱에도 도움이됩니다.
-
설명서 의 언어 참조 및 예제를 읽으십시오 . 두 번, 다소 능숙 해집니다.
파서 오류를 해석하는 방법
일반적인 구문 오류 메시지는 다음과 같습니다.
구문 분석 오류 : 구문 오류, 예기치 못한 T_STRING , 기대 ‘
;
‘ 에 file.php 에 라인 (217)
구문 실수 의 가능한 위치를 나열합니다 . 언급 된 파일 이름 과 줄 번호를 참조하십시오 .
모니 커 등은 T_STRING
파서 / 토크 나이가 마지막으로 처리 할 수있는 기호 설명합니다. 그러나 이것이 반드시 구문 오류의 원인은 아닙니다.
이전 코드 라인 도 살펴 보는 것이 중요합니다 . 종종 구문 오류는 이전에 발생한 실수 일뿐입니다. 에러 라인 번호는 파서가이를 처리하기 위해 결정적으로 포기한 곳입니다.
구문 오류 해결
구문 히컵을 좁히고 수정하는 방법에는 여러 가지가 있습니다.
-
언급 된 소스 파일을여십시오. 언급 된 코드 라인을보십시오 .
-
런 어웨이 스트링과 잘못 배치 된 연산자의 경우 일반적으로 범인을 찾는 위치입니다.
-
왼쪽에서 오른쪽으로 행을 읽고 각 기호의 기능을 상상하십시오.
-
-
보다 정기적으로 선행 라인 도 살펴 봐야 합니다.
-
특히 누락 된
;
세미콜론은 이전 줄 끝 / 문에서 누락되었습니다. (적어도 문체 관점에서는.) -
경우
{
코드 블록이}
잘못 폐쇄 또는 중첩, 당신은 소스 코드까지 한층 더 조사해야 할 수도 있습니다. 적절한 코드 들여 쓰기 를 사용 하여 단순화 하십시오 .
-
-
상기 봐 구문 색상 지정 !
-
문자열과 변수 및 상수는 모두 다른 색을 가져야합니다.
-
작업자도
+-*/.
구별해야합니다. 그렇지 않은 경우 잘못된 컨텍스트에있을 수 있습니다. -
문자열 색상 지정이 너무 멀리 또는 너무 길어지면 이스케이프 처리되지 않거나 누락 된 닫기
"
또는'
문자열 표시 가 발견 된 것 입니다. -
서로 같은 색의 문장 부호 두 개가 나란히 있으면 문제가 발생할 수 있습니다. 그렇지 않은 경우 일반적으로 사업자는 고독한있다
++
,--
연산자 다음, 또는 괄호. 서로 직접적으로 연결되는 두 개의 문자열 / 식별자는 대부분의 상황에서 올바르지 않습니다.
-
-
공백은 당신의 친구 입니다. 따라 어떤 코딩 스타일을.
-
긴 줄을 일시적으로 끊습니다.
-
연산자 또는 상수와 문자열 사이 에 줄 바꿈을 자유롭게 추가 할 수 있습니다 . 구문 분석기는 구문 분석 오류에 대한 행 번호를 구체화합니다. 매우 긴 코드를 보는 대신 누락되거나 잘못 배치 된 구문 기호를 분리 할 수 있습니다.
-
복잡한
if
문장을 별개의 또는 중첩 된if
조건 으로 나눕니다 . -
긴 수학 공식이나 논리 체인 대신 임시 변수를 사용하여 코드를 단순화하십시오. (가독성이 높을수록 오류가 줄어 듭니다.)
-
다음 사이에 줄 바꾸기를 추가하십시오.
- 올바른 것으로 쉽게 식별 할 수있는 코드
- 확실치 않은 부분은
- 그리고 파서가 불평하는 줄.
긴 코드 블록을 분할 하면 구문 오류의 원인을 찾는 데 실제로 도움 이 됩니다.
-
-
위반 코드를 주석 처리하십시오 .
-
문제점 소스를 분리 할 수 없으면 코드 블록을 주석 처리 (및 임시 제거)하십시오.
-
구문 분석 오류를 제거하자마자 문제의 원인을 찾았습니다. 더 자세히보세요.
-
때로는 완전한 기능 / 방법 블록을 일시적으로 제거하려고합니다. (중괄호가 일치하지 않고 들여 쓰기가 잘못된 코드 인 경우)
-
구문 문제를 해결할 수 없으면 주석 처리 된 섹션 을 처음부터 다시 작성 하십시오 .
-
-
새로 온 사람은 혼란스러운 구문 구조를 피하십시오.
-
삼항
? :
조건 연산자는 코드를 압축 할 수 있으며 실제로 유용합니다. 그러나 모든 경우에 가독성을 지원하지는 않습니다. 일반 선호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에 의해 색인화 됨 ). 따라서 관련된 내용을 찾기 전에 몇 페이지를 더 살펴 봐야 할 수도 있습니다.
추가 안내서 :
- David Sklar의 PHP 디버깅 기본
- Jason McCreary의 PHP 오류 수정
- PHP 오류 – Mario Lurig의 10 가지 실수
- 일반적인 PHP 오류 및 솔루션
- WordPress 웹 사이트의 문제를 해결하고 해결하는 방법
- 디자이너를위한 PHP 오류 메시지 안내 -Smashing Magazine
죽음의 흰색 화면
웹 사이트가 비어있는 경우 일반적으로 구문 오류가 원인입니다. 다음을 사용하여 디스플레이를 활성화하십시오.
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에서 사용 가능) :
답변
예기치 않은 [
요즘 예기치 않은 [
배열 괄호는 오래된 PHP 버전에서 일반적으로 나타납니다. 짧은 배열 구문 PHP 보낸 가능 > = 5.4 . 이전 설치 만 지원 array()
합니다.
$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
⇑
이전 PHP 버전에서는 배열 함수 결과 역 참조를 사용할 수 없습니다.
$result = get_whatever()["key"];
⇑
참조-이 오류는 PHP에서 무엇을 의미합니까? – “구문 오류, 예기치 않은 \[
“ 은 가장 일반적이고 실용적인 해결 방법을 보여줍니다.
하지만 항상 PHP 설치를 업그레이드하는 것이 좋습니다. 공유 웹 호스팅 계획의 경우, 먼저 SetHandler php56-fcgi
새로운 런타임을 가능하게하는 데 사용할 수 있는지 먼저 조사하십시오 .
또한보십시오:
- 역 참조 기능 결과를위한 PHP 구문 → PHP 5.4부터 가능
- PHP 구문 오류, 예기치 않은 ‘[‘
- 배열의 약자 : {} 또는 []와 같은 리터럴 구문이 있습니까?
- PHP 5.3.10 대 PHP 5.5.3 구문 오류 예기치 않은 ‘[‘
- array ()와 []의 PHP 차이점
- PHP 배열 구문 분석 오류 왼쪽 대괄호 “[“
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
이름이 있으며 현재 표현 / 문구 구조에 맞지 않음을 의미합니다 .
-
세미콜론 누락
가장 일반적으로 이전 줄에서 누락 된 세미콜론 을 나타냅니다 . 명령문 다음의 변수 지정은 어디를 볼 수 있는지를 나타내는 좋은 지표입니다.
⇓ func1() $var = 1 + 2; # parse error in line +2
-
문자열 연결
빈번한 사고는 문자열 연결입니다잊혀진
.
연산자 .⇓ print "Here comes the value: " $value;
Btw, 당신은 선호해야 가독성에 도움이 될 때마다 문자열 보간 (큰 따옴표의 기본 변수)을 . 이러한 구문 문제를 피할 수 있습니다.
문자열 보간은 스크립팅 언어 핵심 기능입니다. 그것을 사용하는 데 부끄러움이 없습니다. 변수
.
연결이 더 빠르다 는 미세 최적화 조언 무시 . 그렇지 않습니다. -
누락 된 표현식 연산자
물론 산술 연산과 같은 다른 표현식에서도 동일한 문제가 발생할 수 있습니다.
⇓ print 4 + 7 $var;
PHP는 추측 할 수 없다변수를 더하거나 빼거나 비교해야하는지 여기서 .
-
기울기
구문 분석기는 예상되는 쉼표
,
를 표시하는 배열 채우기와 같이 구문 목록과 동일합니다 .⇓ $var = array("1" => $val, $val2, $val3 $val4);
또는 함수 매개 변수 목록 :
⇓ function myfunc($param1, $param2 $param3, $param4)
이와 함께 with
list
또는global
statement 또는 루프에;
세미콜론이 없을 때이 내용을 볼 수 있습니다for
. -
클래스 선언
이 파서 오류는 클래스 선언 에서도 발생합니다 . 표현식이 아닌 정적 상수 만 할당 할 수 있습니다. 따라서 파서는 변수를 할당 된 데이터로 불평합니다.
class xyz { ⇓ var $value = $_GET["input"];
비교할
}
수 없는 닫는 중괄호는 특히 여기에서 이어질 수 있습니다. 메소드가 너무 일찍 종료되면 (적절한 들여 쓰기를 사용하십시오!) 일반적으로 클래스 변수에 길잃은 변수가 잘못 배치됩니다. -
식별자 뒤의 변수
변수가 식별자를 직접 따르지 않도록 할 수도 없습니다 .
⇓ $this->myFunc$VAR();
Btw, 이것은 아마도 변수 변수 를 사용하려는 의도의 일반적인 예 입니다. 이 경우
$this->{"myFunc$VAR"}();
예를 들어 변수 속성 조회가 가능 합니다.변수 변수를 사용하는 것은 예외입니다. 신규 이민자들은 배열이 더 단순하고 더 적합 할 때에도 너무 캐주얼하게 사용하려고합니다.
-
언어 구성 후 괄호 누락
성급한 타이핑은
if
andfor
및foreach
statement에 대한 여는 괄호 또는 닫는 괄호를 잊을 수 있습니다 .⇓ foreach $array as $key) {
솔루션 :
(
명령문과 변수 사이에 누락 된 개구부 를 추가하십시오 .⇓ if ($var = pdo_query($sql) { $result = …
곱슬
{
걸림쇠가 종료하지 않고, 상기 코드 블록 열리지if
와 식)
제 닫는 괄호. -
그렇지 않으면 조건을 기대하지 않습니다
⇓ else ($var >= 0)
솔루션 :에서 조건을 제거
else
하거나 사용하십시오elseif
. -
폐쇄 용 브래킷 필요
⇓ function() uses $var {}
해결책 : 주위에 대괄호를 추가하십시오
$var
. -
보이지 않는 공백
“Invisible stray Unicode” 에 대한 참조 답변 (예 : 비 공백 공백 ) 에서 언급했듯이 , 다음과 같은 의심없는 코드에 대해이 오류가 표시 될 수 있습니다.
<?php ⇐ $var = new PDO(...);
파일 시작 및 복사하여 붙여 넣은 코드에서 다소 널리 퍼져 있습니다. 코드에 시각적으로 구문 문제가없는 것으로 보이면 hexeditor를 확인하십시오.
또한보십시오
답변
예기치 않은 T_CONSTANT_ENCAPSED_STRING
예기치 않은 T_ENCAPSED_AND_WHITESPACE
다루기 힘든 이름 T_CONSTANT_ENCAPSED_STRING
과 T_ENCAPSED_AND_WHITESPACE
인용 된 리터럴 참조"string"
.
그것들은 다른 상황에서 사용되지만 구문 문제는 매우 유사합니다. T_ENCAPSED… 경고는 큰 따옴표로 묶인 문자열 컨텍스트에서 발생하지만 T_CONSTANT… 문자열은 종종 일반 PHP 표현식 또는 명령문에서 엉망입니다.
-
잘못된 변수 보간
그리고 잘못된 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는 실제로 고유 한 구문 색상을 사용합니다.
-
연결 누락
문자열이 표현식 뒤에 있지만 연결 또는 다른 연산자가 없으면 PHP가 문자열 리터럴에 대해 불평하는 것을 볼 수 있습니다.
⇓ print "Hello " . WORLD " !";
그것은 당신과 나에게 분명하지만 PHP 는 문자열이 거기에 추가되어야한다는 것을 추측 할 수 없습니다 .
-
혼란스러운 문자열 인용 엔클로저
문자열 구분 기호를 혼동 할 때 동일한 구문 오류가 발생합니다 .
'
작은"
따옴표 나 큰 따옴표로 시작하는 문자열 도 동일하게 끝납니다.⇓ print "<a href="' . $link . '">click here</a>"; ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟
이 예는 큰 따옴표로 시작했습니다. 그러나 큰 따옴표도 HTML 속성으로 지정되었습니다. 그러나 의도 한 연결 연산자는 작은 따옴표로 묶인 두 번째 문자열의 일부로 해석되었습니다.
팁 : 작은 따옴표와 큰 따옴표로 묶은 문자열에 약간 다른 색상을 사용하도록 편집기 / IDE를 설정하십시오. (또한 텍스트 출력을위한 큰 따옴표로 묶인 문자열, 상수 값과 같은 작은 따옴표로 묶인 문자열을 선호하는 응용 프로그램 논리에 도움이됩니다.)
이것은 큰 따옴표를 먼저 사용하지 않아야하는 좋은 예입니다. 대신 사용하십시오
\"
HTML 속성의 따옴표에 적절한 이스케이프 를 사용하십시오.print "<a href=\"{$link}\">click here</a>";
이로 인해 구문 혼동이 발생할 수 있지만 더 나은 IDE / 편집기는 모두 이스케이프 된 따옴표를 다르게 색칠하여 도움을줍니다.
-
오프닝 견적 누락
마찬가지로 오프닝
"
/'
따옴표를 잊어 버렸습니다. 파서 오류에 대한 조리법을 :⇓ make_url(login', 'open');
여기
', '
분명히login
문자열 매개 변수로 의도 되었을 때 베어 워드 다음에 문자열 리터럴이 됩니다. -
배열 목록
,
배열 생성 블록에서 쉼표 를 놓치면 구문 분석기에 두 개의 연속 문자열이 표시됩니다.array( ⇓ "key" => "value" "next" => "....", );
마지막 줄에는 항상 추가 쉼표가 포함될 수 있지만 그 사이에있는 쉼표를 간과하는 것은 용서할 수 없습니다. 구문 강조 없이는 찾기가 어렵습니다.
-
기능 파라미터 목록
함수 호출도 마찬가지입니다 .
⇓ myfunc(123, "text", "and" "more")
-
폭주
일반적인 변형은 잊혀진 문자열 종결 자입니다.
⇓ mysql_evil("SELECT * FROM stuffs); print "'ok'"; ⇑
PHP는 서로 직접적으로 따르는 두 개의 문자열 리터럴에 대해 불평합니다. 그러나 실제 원인은 닫히지 않은 이전 문자열입니다.
또한보십시오
답변
예기치 않은 T_STRING
T_STRING
약간의 오해입니다. 인용 된 것은 아닙니다 "string"
. 원시 식별자가 발생했음을 의미합니다. bare
단어에서 남은 단어 CONSTANT
또는 함수 이름, 따옴표없는 문자열 또는 일반 텍스트 까지 다양 합니다.
-
잘못 인용 된 문자열
그러나이 구문 오류는 잘못 인용 된 문자열 값에 가장 일반적입니다. 이스케이프 처리되지 않고 길을 잃
"
거나'
인용 부호를 잘못 표시하면⇓ ⇓ 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 변수 값을 보지 못하고 소스를 잊어 버린 코드에 집중하면 발생합니다. 예는 여기 -
닫히지 않은 문자열
닫는
"
것을 놓치면 일반적으로 구문 오류가 나중에 구체화됩니다. 종료되지 않은 문자열은 종종 다음 의도 된 문자열 값까지 약간의 코드를 소비합니다.⇓ echo "Some text", $a_variable, "and some runaway string ; success("finished"); ⇯
T_STRING
파서가 항의 할 수있는 것은 문자 그대로가 아닙니다 . 또 다른 빈번한 변형은Unexpected '>'
인용되지 않은 리터럴 HTML입니다. -
비 프로그래밍 문자열 따옴표
블로그 나 웹 사이트에서 코드 를 복사하여 붙여 넣으면 때로는 유효하지 않은 코드가 생길 수 있습니다. 활자체 인용문은 PHP가 기대하는 것이 아닙니다 .
$text = ’Something something..’ + ”these ain't quotes”;
활자체 / 스마트 따옴표는 유니 코드 기호입니다. PHP는 그것들을 인접한 영숫자 텍스트의 일부로 취급합니다. 예를 들어
”these
상수 식별자로 해석됩니다. 그러나 다음 텍스트 리터럴은 파서에서 베어 워드 / T_STRING으로 표시됩니다. -
누락 된 세미콜론; 다시
이전 줄에 종료되지 않은 표현식이 있으면 다음 명령문 또는 언어 구문이 원시 식별자로 표시됩니다.
⇓ func1() function2();
PHP는 두 함수를 차례대로 실행하거나 결과를 곱하거나 추가하거나 비교하거나 한 가지만 실행하려는 경우 알 수 없습니다
||
. -
짧은 오픈 태그 및
<?xml
PHP 스크립트에서 헤더이것은 드문 일입니다. 그러나 short_open_tags가 활성화 되어 있으면 XML 선언으로 PHP 스크립트 를 시작할 수 없습니다 .
⇓ <?xml version="1.0"?>
PHP는 그 내용을보고
<?
그 자체를 되 찾을 것입니다. 길 잃은xml
것이 무엇인지 이해하지 못합니다 . 상수로 해석됩니다. 그러나 이것은version
또 다른 문자 / 상수로 보일 것입니다. 그리고 파서는 사이에 표현식 연산자가 없으면 두 개의 후속 리터럴 / 값을 이해할 수 없으므로 파서가 실패합니다. -
보이지 않는 유니 코드 문자
구문 오류의 가장 끔찍한 원인은 공백 이 아닌 공간 과 같은 유니 코드 기호 입니다. PHP는 유니 코드 문자를 식별자 이름으로 허용합니다. 의심스럽지 않은 코드에 대해 T_STRING 파서 불만이 접수 된 경우 :
<?php print 123;
다른 텍스트 편집기를 분리해야합니다. 또는 hexeditor도. 일반 공간과 줄 바꿈처럼 보이는 곳에 보이지 않는 상수가 포함될 수 있습니다. Java 기반 IDE는 폭이 0 인 공백, 단락 구분 기호 등으로 UTF-8 BOM이 엉망인 경우가 종종 있습니다. 모든 항목을 다시 편집하고 공백을 제거하고 일반 공백을 다시 추가하십시오.
;
각 줄 시작에 중복 명령문 구분 기호를 추가하여 범위를 좁힐 수 있습니다 .<?php ;print 123;
여기서
;
세미콜론을 추가 하면 앞의 보이지 않는 문자가 정의되지 않은 상수 참조 (표로 표현)로 변환됩니다. 그 대가로 PHP가 유용한 알림을 생성합니다. -
변수 이름 앞에`$`부호가 없습니다.
PHP의 변수 는 달러 기호와 변수 이름으로 표시됩니다.
달러 기호 (
$
)는 식별자를 변수의 이름으로 표시 하는 시길 입니다. 이시길이 없으면 식별자는 언어 키워드 또는 상수 일 수 있습니다.다른 언어 (C, Java, JavaScript 등) 로 작성된 코드에서 PHP 코드가 “번역” 되었을 때 발생하는 일반적인 오류 입니다. 이러한 경우 변수 유형의 선언 (원래 코드가 유형이 지정된 변수를 사용하는 언어로 작성된 경우)도 몰래 발생하여이 오류가 발생할 수 있습니다.
-
이스케이프 된 따옴표
\
문자열에 사용 하면 특별한 의미가 있습니다. 이를 ” 이스케이프 문자 “라고하며 일반적으로 파서가 다음 문자를 문자 그대로 가져 오도록 지시합니다.예 :
echo 'Jim said \'Hello\'';
인쇄Jim said 'hello'
문자열의 닫는 따옴표를 이스케이프하면 닫는 따옴표는 문자 그대로 취해지지 않습니다. 즉, 문자열의 일부로 인쇄 가능한 따옴표처럼 문자열을 닫지 않습니다. 다음 문자열을 열거 나 스크립트 끝에서 일반적으로 구문 분석 오류로 표시됩니다.
Windows에서 경로를 지정할 때 매우 일반적인 오류 :
"C:\xampp\htdocs\"
잘못되었습니다. 당신은 필요합니다"C:\\xampp\\htdocs\\"
.
답변
예기치 않은 (
여는 괄호는 일반적으로 if
/ foreach
/ for
/ array
/ 와 같은 언어 구성을 따르 list
거나 산술 표현식을 시작합니다. "strings"
, previous ()
, lone $
및 일부 일반적인 선언 컨텍스트에서 구문 상 올바르지 않습니다 .
-
함수 선언 파라미터
이 오류의 경우는 드물지만 표현식을 기본 함수 매개 변수로 사용하려고합니다 . PHP7에서도 지원되지 않습니다 :
function header_fallback($value, $expires = time() + 90000) {
함수 선언의 매개 변수는 리터럴 값 또는 상수 표현식 일 수 있습니다. 함수 호출과 달리 자유롭게 사용할 수있는 곳
whatever(1+something()*2)
등 -
클래스 속성 기본값
표현식이 아닌 리터럴 / 상수 값만 허용되는 클래스 멤버 선언 과 동일 합니다.
class xyz { ⇓ var $default = get_config("xyz_default");
그런 것들을 생성자에 넣으십시오. PHP 속성이 함수를 허용하지 않는 이유 도 참조하십시오 .
PHP 7은
var $xy = 1 + 2 +3;
상수 표현 만 허용 합니다. -
PHP의 자바 스크립트 문법
PHP에서 JavaScript 또는 jQuery 구문을 사용할 수없는 이유는 다음과 같습니다.
<?php ⇓ print $(document).text();
이 경우 일반적으로 종료되지 않은 선행 문자열을 나타냅니다. 그리고
<script>
PHP 코드 컨텍스트로 유출되는 리터럴 섹션. -
isset (()), 비어 있음, 키, 다음, 현재
모두
isset()
와 것은empty()
언어에 내장 된 기능이 아닌 함수입니다. 그들은 직접 변수에 액세스해야합니다 . 실수로 괄호 쌍을 너무 많이 추가하면 표현식이 작성됩니다.⇓ if (isset(($_GET["id"]))) {
암시 적 변수 이름 액세스가 필요한 모든 언어 구성에도 동일하게 적용됩니다. 이 내장은 언어 문법의 일부이므로 장식적인 추가 괄호를 허용하지 않습니다.
변수 참조가 필요하지만 표현식 결과가 전달되는 사용자 레벨 함수는 대신 런타임 오류가 발생합니다.
예기치 않은 )
-
부재 함수 파라미터
함수 호출에서 마지막으로 쉼표를 사용할 수 없습니다 . PHP는 거기에 가치가 있기 때문에 조기 종결
)
괄호 에 대해 불평 합니다.⇓ callfunc(1, 2, );
후행 쉼표는
array()
또는list()
구성 에서만 허용됩니다 . -
미완성 된 표현
산술 표현식에서 무언가를 잊어 버린 경우 파서는 포기합니다. 어떻게 해석해야합니까?
⇓ $var = 2 * (1 + );
그리고 닫는 것을 잊어 버린 경우
)
예기치 않은 세미콜론에 대한 불만이 표시됩니다. -
Foreach as
constant
들어 잊어 가변
$
제어 문에서 접두사 당신은 볼 것이다 :↓ ⇓ foreach ($array as wrong) {
여기서 PHP는 때때로
::
대신 기대한다고 말합니다 . class :: $ variable 클래스가 예상되는 $ variable 표현식을 만족시킬 수 있기 때문에 ..
예기치 않은 {
중괄호 {
와 }
코드 블록을 묶습니다. 그리고 그들에 대한 구문 오류는 일반적으로 잘못된 중첩을 나타냅니다.
-
에서 일치하지 않는 하위 표현식
if
가장 일반적으로 불균형
(
이며)
파서가 오프닝 곱슬{
이 너무 일찍 나타나는 것에 대해 불평하는 경우 원인이됩니다 . 간단한 예 :⇓ if (($x == $y) && (2 == true) {
괄호를 세거나 IDE를 사용하십시오. 또한 공백없이 코드를 작성하지 마십시오. 가독성이 중요합니다.
-
식 문맥에서의 {와}
식에 중괄호를 사용할 수 없습니다. 괄호와 중괄호를 혼동하면 언어 문법을 준수하지 않습니다.
⇓ $var = 5 * {7 + $x};
로컬 범위 변수와 같은 식별자 구성에는 몇 가지 예외가 있습니다
${references}
. -
변수 변수 또는 곱슬 var 표현식
이것은 매우 드 rare니다. 그러나 복잡한 변수 표현에 대한 불만을 제기
{
하고}
파싱 할 수도 있습니다 .⇓ print "Hello {$world[2{]} !";
}
그러한 상황에서 예상치 못한 가능성이 더 높지만 .
예기치 않은 }
“예기치 않은 }
“오류가 발생하면 대부분 코드 블록을 너무 일찍 닫은 것입니다.
-
코드 블록의 마지막 문장
종료되지 않은 표현에 발생할 수 있습니다.
함수 / 코드 블록의 마지막 행에 후미
;
세미콜론 이없는 경우 :function whatever() { doStuff() } ⇧
여기서 파서는 여전히
+ 25;
함수 결과 또는 다른 것에 추가 하고 싶었는지 알 수 없습니다 . -
잘못된 블록 중첩 / 잊어 버린
{
코드 블록이
}
너무 일찍 닫히거나 개구부를 잊었을 때 때때로이 파서 오류가 표시됩니다{
.function doStuff() { if (true) ⇦ print "yes"; } } ⇧
위의 스 니펫에서
if
여는{
중괄호 가 없었습니다 . 따라서}
아래 의 닫는 것이 중복되었습니다. 따라서}
기능을위한 다음 닫힘 은 원래 여는{
중괄호와 연관되지 않았습니다 .이러한 오류는 적절한 코드 들여 쓰기없이 찾기가 훨씬 더 어렵습니다. IDE와 대괄호 일치를 사용하십시오.
예기치 않은 {
예상(
조건 / 선언 헤더 및 코드 블록이 필요한 언어 구문 이이 오류를 트리거합니다.
-
파라미터 목록
예를 들어 매개 변수 목록 이없는 잘못 선언 된 함수 는 허용되지 않습니다.
⇓ function whatever { }
-
제어문 조건
또한
if
조건없이 가질 수 없습니다 .⇓ if { }
분명히 말이되지 않습니다. 평범한 용의자
for
/foreach
,while
/do
등에 대해서도 마찬가지입니다 .이 특정 오류가 발생하면 몇 가지 수동 예제를 찾아야합니다.