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는 신참 코더도 환영하지만 대부분 전문 프로그래밍 질문을 대상으로합니다.
- 모든 사람의 코딩 실수와 좁은 오타에 대답하는 것은 대부분 주제에서 벗어난 것으로 간주됩니다.
- 따라서 구문 수정 요청을 게시하기 전에 시간을내어 기본 단계 를 따르십시오 .
- 그래도 해결해야하는 경우 자신의 해결 이니셔티브, 시도한 수정 사항, 무엇이 잘못되었거나 잘못되었는지에 대한 생각 프로세스를 보여주세요.
귀하의 경우 브라우저 와 같은 "구문 에러 : 잘못된 문자"와 같은 오류 메시지를 표시합니다, 그것은 사실이 아니다 PHP - 관련,하지만 자바 스크립트 - 구문 오류 .
공급 업체 코드에서 발생하는 구문 오류 : 마지막으로 코드베이스를 편집하여 구문 오류가 발생하지 않았지만 외부 공급 업체 패키지 설치 또는 업그레이드 후 PHP 버전 비 호환성 때문일 수 있으므로 플랫폼 설정에 대한 공급 업체의 요구 사항을 확인하십시오. .
구문 오류는 무엇입니까?
PHP는 C 스타일 및 명령형 프로그래밍 언어에 속합니다 . 엄격한 문법 규칙을 가지고있어 잘못 배치 된 기호 나 식별자를 발견했을 때 복구 할 수 없습니다. 코딩 의도를 추측 할 수 없습니다.
가장 중요한 팁
항상 취할 수있는 몇 가지 기본 예방 조치가 있습니다.
적절한 코드 들여 쓰기를 사용 하거나 높은 코딩 스타일을 채택하십시오. 가독성은 불규칙성을 방지합니다.
사용하여 IDE PHP 또는 편집기 와 구문 강조 . 괄호 / 대괄호 균형 조정에도 도움이됩니다.
매뉴얼 의 언어 참조 및 예제를 읽으십시오 . 어느 정도 능숙 해지려면 두 번.
파서 오류를 해석하는 방법
일반적인 구문 오류 메시지는 다음과 같습니다.
구문 분석 오류 : 구문 오류, 예기치 않은 T_STRING , 217 행의 file.php 에서 '
;
' 가 필요 합니다.
구문 오류 의 가능한 위치를 나열합니다 . 언급 된 파일 이름 과 줄 번호를 참조하십시오 .
모니 커 등은 T_STRING
파서 / 토크 나이가 마지막으로 처리 할 수있는 기호 설명합니다. 그러나 이것이 반드시 구문 오류의 원인은 아닙니다.
이전 코드 라인 도 살펴 보는 것이 중요합니다 . 종종 구문 오류는 이전에 발생한 사고 일뿐입니다. 오류 줄 번호는 파서가 모든 것을 처리하기 위해 결정적으로 포기한 곳입니다.
구문 오류 해결
구문 문제를 좁히고 수정하는 방법에는 여러 가지가 있습니다.
언급 된 소스 파일을 엽니 다. 언급 된 코드 라인을보십시오 .
폭주 문자열 및 잘못 배치 된 연산자의 경우 일반적으로 여기에서 범인을 찾습니다.
왼쪽에서 오른쪽으로 줄을 읽고 각 기호가 무엇을하는지 상상해보십시오.
보다 정기적으로 선행 줄 도 살펴볼 필요가 있습니다.
특히, 누락 된
;
세미콜론이 이전 줄 끝 / 문에서 누락되었습니다. (적어도 문체 적 관점에서는.)경우
{
코드 블록이}
잘못 폐쇄 또는 중첩, 당신은 소스 코드까지 한층 더 조사해야 할 수도 있습니다. 이를 단순화 하려면 적절한 코드 들여 쓰기 를 사용하십시오 .
상기 봐 구문 색상 지정 !
문자열과 변수, 상수는 모두 다른 색을 가져야합니다.
연산자도
+-*/.
구별해야합니다. 그렇지 않으면 잘못된 컨텍스트에있을 수 있습니다.문자열 색상 화가 너무 멀리 또는 너무 짧게 확장되면 이스케이프 처리되지 않은 또는 누락 된 닫기
"
또는'
문자열 마커를 찾은 것 입니다.같은 색의 두 문장 부호가 나란히 있으면 문제가 발생할 수 있습니다. 그렇지 않은 경우 일반적으로 사업자는 고독한있다
++
,--
연산자 다음, 또는 괄호. 서로 직접 뒤 따르는 두 개의 문자열 / 식별자는 대부분의 컨텍스트에서 올바르지 않습니다.
공백은 당신의 친구 입니다. 따라 어떤 코딩 스타일을.
긴 줄을 일시적으로 끊습니다.
연산자 또는 상수와 문자열 사이에 자유롭게 줄 바꿈 을 추가 할 수 있습니다 . 그런 다음 파서는 파싱 오류에 대한 줄 번호를 구체화합니다. 매우 긴 코드를 보는 대신 누락되거나 잘못 배치 된 구문 기호를 분리 할 수 있습니다.
복잡한
if
문을 별개의 또는 중첩 된if
조건 으로 분할합니다 .긴 수학 공식이나 논리 체인 대신 임시 변수를 사용하여 코드를 단순화하십시오. (더 읽기 쉬움 = 오류 감소)
다음 사이에 줄 바꿈 추가 :
- 정확한 것으로 쉽게 식별 할 수있는 코드,
- 확실하지 않은 부분,
- 그리고 파서가 불평하는 줄.
긴 코드 블록을 분할 하면 구문 오류의 원인을 찾는 데 도움 이 됩니다.
문제가되는 코드를 주석 처리하십시오 .
문제 소스를 분리 할 수없는 경우 코드 블록을 주석 처리하여 일시적으로 제거하십시오.
구문 분석 오류를 제거하자마자 문제의 원인을 찾은 것입니다. 더 자세히보세요.
때때로 완전한 기능 / 방법 블록을 일시적으로 제거하고 싶을 때가 있습니다. (일치하지 않는 중괄호 및 잘못 들여 쓰기 된 코드의 경우)
구문 문제를 해결할 수없는 경우 주석 처리 된 섹션 을 처음부터 다시 작성해 보십시오 .
초보자로서 혼란스러운 구문 구조를 피하십시오.
삼항
? :
조건 연산자는 코드를 압축 할 수 있으며 실제로 유용합니다. 그러나 모든 경우에 가독성에 도움이되는 것은 아닙니다.if
익숙하지 않은 동안 평범한 진술을 선호하십시오.PHP의 대체 구문 (
if:
/elseif:
/endif;
)은 템플릿에 일반적이지만 일반{
코드}
블록 보다 따르기가 쉽지 않습니다 .
가장 널리 퍼진 신규 사용자 실수는 다음과 같습니다.
;
문 / 줄을 종료하기위한 세미콜론 이 없습니다.일치하지 않는 문자열 따옴표
"
또는'
내부의 이스케이프 처리되지 않은 따옴표.특히 문자열
.
연결의 경우 잊혀진 연산자 .불균형
(
괄호)
. 보고 된 줄에서 세십시오. 같은 수가 있습니까?
하나의 구문 문제를 해결하면 다음 문제를 발견 할 수 있다는 것을 잊지 마십시오.
한 가지 문제를 해결하고 아래의 일부 코드에서 다른 문제가 발생하면 대부분 올바른 경로에있는 것입니다.
새 구문을 편집 한 후 같은 줄에 오류가 발생하면 시도한 변경이 실패 일 수 있습니다. (항상 그런 것은 아닙니다.)
수정할 수없는 경우 이전에 작동했던 코드의 백업을 복원합니다.
- 소스 코드 버전 관리 시스템을 채택하십시오. 항상
diff
중단 된 마지막 작업 버전을 볼 수 있습니다 . 구문 문제가 무엇인지 알 수 있습니다.
- 소스 코드 버전 관리 시스템을 채택하십시오. 항상
보이지 않는 길잃은 유니 코드 문자 : 경우 에 따라 소스에서 16 진 편집기 또는 다른 편집기 / 뷰어 를 사용해야합니다 . 코드를 보는 것만으로는 일부 문제를 찾을 수 없습니다.
grep --color -P -n "\[\x80-\xFF\]" file.php
비 ASCII 기호를 찾기위한 첫 번째 방법으로 시도하십시오 .특히 BOM, 너비가 0 인 공백 또는 끊기지 않는 공백 및 스마트 따옴표는 정기적으로 소스 코드로 들어갈 수 있습니다.
어떤 유형의 줄 바꿈 이 파일에 저장 되는지 확인 하십시오.
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
일반적으로, 또는를 통해 .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에서 사용 가능) :
- NetBeans [무료]
- PHPStorm [$ 199 USD]
- 이클립스 와 PHP 플러그인 [무료]
- 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
새로운 런타임을 활성화하는 데 사용할 수 있는지 먼저 조사하십시오 .
또한보십시오:
- 함수 결과 역 참조를위한 PHP 구문 → PHP 5.4부터 가능
- PHP 구문 오류, 예기치 않은 '['
- 배열의 속기 : {} 또는 []와 같은 리터럴 구문이 있습니까?
- PHP 5.3.10 대 PHP 5.5.3 구문 오류 예기치 않은 '['
- array ()와 []의 PHP 차이점
- PHP 배열 구문 구문 분석 오류 왼쪽 대괄호 "["
BTW, 전처리 기와 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
상수 이름으로 해석합니다 .배열 변수 (여기서는 일반적인 원인)에 액세스하려는 경우 선행
$
시길 을 추가하면$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)
동등하게 당신은 이것을 볼 수 있습니까
list
또는global
부족 때 문 또는;
A의 세미콜론for
루프를.클래스 선언
이 구문 분석기 오류는 클래스 선언 에서도 발생합니다 . 표현식이 아닌 정적 상수 만 할당 할 수 있습니다. 따라서 파서는 할당 된 데이터로 변수에 대해 불평합니다.
class xyz { ⇓ var $value = $_GET["input"];
일치하지 않는
}
닫는 중괄호는 특히 여기로 이어질 수 있습니다. 메소드가 너무 일찍 종료되면 (적절한 들여 쓰기를 사용하십시오!), 일반적으로 스트레이 변수가 클래스 선언 본문에 잘못 배치됩니다.식별자 뒤의 변수
또한 변수가 식별자 뒤에 직접 올 수는 없습니다 .
⇓ $this->myFunc$VAR();
Btw, 이것은 아마도 변수 변수 를 사용하려는 의도가있는 일반적인 예 입니다. 이 경우
$this->{"myFunc$VAR"}();
예를 들어 변수 속성 조회입니다 .변수 변수를 사용하는 것은 예외 여야합니다. 신규 이민자들은 어레이가 더 간단하고 더 적절할 때에도 너무 자연스럽게 사용하려고합니다.
언어 구성 후 괄호 누락
급하게 입력하면
if
및for
및foreach
문에 대한 여는 괄호를 잊어 버릴 수 있습니다 .⇓ foreach $array as $key) {
솔루션 :
(
문과 변수 사이에 누락 된 여는 추가 .Else는 조건을 기대하지 않습니다
⇓ 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 컨텍스트에서 필수입니다. 그러나 큰 따옴표로 묶인 문자열 (또는 HEREDOC)에서는 이것은 실수입니다. 파서
'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는 서로 바로 뒤 따르는 두 개의 문자열 리터럴에 대해 불평합니다. 그러나 실제 원인은 물론 닫히지 않은 이전 문자열입니다.
또한보십시오
- PHP에서 연관 배열의 보간 (큰 따옴표로 묶인 문자열)
- PHP-구문 오류, 예기치 않은 T_CONSTANT_ENCAPSED_STRING
- 구문 오류, PHP에서 예상치 못한 T_CONSTANT_ENCAPSED_STRING
- SQL 쿼리의 예기치 않은 T_CONSTANT_ENCAPSED_STRING 오류
예상치 못한 T_STRING
T_STRING
약간 잘못된 이름입니다. 인용 된를 참조하지 않습니다 "string"
. 원시 식별자가 발견되었음을 의미합니다. 이것은 bare
단어에서 남은 부분 CONSTANT
또는 함수 이름, 잊혀진 따옴표없는 문자열 또는 일반 텍스트에 이르기까지 다양 합니다.
잘못 인용 된 문자열
그러나이 구문 오류는 잘못 인용 된 문자열 값에 가장 일반적입니다. 이스케이프 처리되지 않은 모든 이스케이프
"
또는'
따옴표는 잘못된 표현식을 형성합니다.⇓ ⇓ echo "<a href="http://example.com">click here</a>";
구문 강조는 그러한 실수를 매우 분명하게 만듭니다. 그것은 탈출을 위해 백 슬래시를 사용하는 것을 기억하는 것이 중요
\"
따옴표, 또는\'
사용 된 따라하는 - 작은 따옴표 문자열 인클로저 .닫히지 않은 문자열
당신이 경우 닫는 그리워
"
다음을 구문 오류는 일반적으로 나중에 구체화. 종결되지 않은 문자열은 다음 의도 된 문자열 값까지 종종 약간의 코드를 소비합니다.⇓ 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의 변수 는 달러 기호와 변수 이름으로 표시됩니다.
달러 기호 (
$
)는 식별자를 변수 이름으로 표시 하는 시길 입니다. 이시길이 없으면 식별자는 언어 키워드 또는 상수 일 수 있습니다.이것은 PHP 코드가 다른 언어 (C, Java, JavaScript 등) 로 작성된 코드에서 "번역" 되었을 때 흔히 발생하는 오류 입니다. 이러한 경우 변수 유형의 선언 (원래 코드가 유형화 된 변수를 사용하는 언어로 작성된 경우)도 몰래 빠져 나와이 오류를 생성 할 수 있습니다.
이스케이프 된 따옴표
\
문자열로 사용 하면 특별한 의미가 있습니다. 이것을 " 이스케이프 문자 "라고하며 일반적으로 파서에게 다음 문자를 문자 그대로 가져 오도록 지시합니다.예 :
echo 'Jim said \'Hello\'';
인쇄됩니다Jim said 'hello'
문자열의 닫는 따옴표를 이스케이프하면 닫는 따옴표가 의도 한대로가 아니라 문자 그대로 사용됩니다. 즉, 문자열을 닫지 않고 문자열의 일부로 인쇄 가능한 따옴표로 사용됩니다. 이것은 일반적으로 다음 문자열을 연 후 또는 스크립트 끝에서 구문 분석 오류로 표시됩니다.
Windows에서 경로를 지정할 때 매우 일반적인 오류 :
"C:\xampp\htdocs\"
잘못되었습니다. 당신은 필요합니다"C:\\xampp\\htdocs\\"
.
예기치 않은 (
여는 괄호는 일반적으로 if
/ foreach
/ for
/ array
/ 와 같은 언어 구조를 따르 list
거나 산술 표현식을 시작합니다. "strings"
, 이전 ()
, 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의 JavaScript 구문
JavaScript 또는 jQuery 구문을 사용 하는 것은 명백한 이유로 PHP에서 작동하지 않습니다.
<?php ⇓ print $(document).text();
이 경우 일반적으로 종료되지 않은 선행 문자열을 나타냅니다.
<script>
PHP 코드 컨텍스트로 유출되는 리터럴 섹션.isset (()), 비어 있음, 키, 다음, 현재
isset()
및 둘 다empty()
기능이 아니라 언어 내장입니다. 그들은 직접 변수에 액세스해야합니다 . 실수로 한 쌍의 괄호를 너무 많이 추가하면 표현식이 생성됩니다.⇓ if (isset(($_GET["id"]))) {
암시 적 변수 이름 액세스가 필요한 모든 언어 구조에도 동일하게 적용됩니다. 이러한 내장 기능은 언어 문법의 일부이므로 장식용 추가 괄호를 허용하지 않습니다.
변수 참조가 필요하지만 표현식 결과가 전달되는 사용자 수준 함수는 대신 런타임 오류를 발생시킵니다.
예기치 않은 )
부재 기능 매개 변수
함수 호출에서 마지막에 쉼표를 사용할 수 없습니다 . PHP는 거기에 값을 기대하므로 조기 닫는
)
괄호 에 대해 불평 합니다.⇓ callfunc(1, 2, );
후행 쉼표는
array()
또는list()
구문 에서만 허용됩니다 .미완성 된 표현
산술 식에서 무언가를 잊으면 파서는 포기합니다. 어떻게 해석해야하나요?
⇓ $var = 2 * (1 + );
그리고 닫는 것을 잊어 버린 경우
)
예기치 않은 세미콜론에 대한 불만이 표시됩니다.Foreach로
constant
들어 잊어 가변
$
제어 문에서 접두사 당신은 볼 것이다 :↓ ⇓ foreach ($array as wrong) {
여기서 PHP는 때때로 예상했던 것을 알려줍니다
::
. class :: $ variable이 예상되는 $ variable 표현식을 충족 할 수 있기 때문에 ..
예기치 않은 {
중괄호 {
와 }
코드 블록을 묶습니다. 그리고 그들에 대한 구문 오류는 일반적으로 일부 잘못된 중첩을 나타냅니다.
일치하지 않는 하위 표현식
if
가장 일반적으로 불균형
(
이며)
파서가{
너무 일찍 나타나는 곱슬 머리 에 대해 불평하는 경우 원인 입니다. 간단한 예 :⇓ if (($x == $y) && (2 == true) {
괄호를 세거나 그에 도움이되는 IDE를 사용하십시오. 또한 공백없이 코드를 작성하지 마십시오. 가독성이 중요합니다.
식 컨텍스트의 {및}
식에는 중괄호를 사용할 수 없습니다. 괄호와 중괄호를 혼동하면 언어 문법을 따르지 않습니다.
⇓ $var = 5 * {7 + $x};
로컬 범위 변수와 같은 식별자 생성에 대한 몇 가지 예외가 있습니다
${references}
.변수 변수 또는 곱슬 var 표현식
이것은 매우 드뭅니다. 그러나 당신은 또한 얻을 수 있습니다
{
및}
복잡한 변수 표현식 파서 불만 :⇓ print "Hello {$world[2{]} !";
}
이러한 상황에서 예상치 못한 일이 발생할 가능성이 더 높습니다 .
예기치 않은 }
"예기치 않은 }
"오류가 발생하면 대부분 코드 블록을 너무 일찍 닫은 것입니다.
코드 블록의 마지막 문
종결되지 않은 표현식에 대해 발생할 수 있습니다.
함수 / 코드 블록의 마지막 줄에 후행
;
세미콜론 이없는 경우 :function whatever() { doStuff() } ⇧
여기서 파서는
+ 25;
함수 결과 에 추가 할 것인지 아니면 다른 것을 추가 할 것인지 알 수 없습니다 .잘못된 블록 중첩 / 잊어 짐
{
코드 블록이
}
너무 일찍 닫혔거나{
심지어 여는 것을 잊었을 때 때때로이 파서 오류가 나타날 것입니다 :function doStuff() { if (true) ⇦ print "yes"; } } ⇧
위의 스 니펫에서
if
여는{
중괄호 가 없었습니다 . 따라서}
아래 의 닫는 것은 중복되었습니다. 따라서}
함수를위한 다음 닫는 은 원래 여는{
중괄호 와 연결될 수 없습니다 .이러한 오류는 적절한 코드 들여 쓰기 없이는 찾기가 훨씬 더 어렵습니다. IDE 및 대괄호 일치를 사용하십시오.
예상치 못한 {
, 예상(
조건 / 선언 헤더 와 코드 블록이 필요한 언어 구조 는이 오류를 트리거합니다.
매개 변수 목록
예를 들어 매개 변수 목록 이없는 잘못 선언 된 함수 는 허용되지 않습니다.
⇓ function whatever { }
제어문 조건
그리고 당신은 마찬가지로
if
없이 조건을 가질 수 없습니다 .⇓ if { }
분명히 말이되지 않습니다. 일반적인 용의자,
for
/foreach
,while
/do
등도 마찬가지입니다 .이 특정 오류가 발생하면 몇 가지 수동 예제를 찾아봐야합니다.
예기치 않은 $ end
PHP가 "예기치 않은 $end
" 에 대해 이야기하면 코드가 너무 일찍 종료되었음을 의미합니다. (이 메시지는 문자 그대로 받아 들였을 때 약간 오해의 소지가 있습니다. 때때로 신규 사용자가 가정하는 것처럼 "$ end"라는 변수에 관한 것이 아닙니다. "파일의 끝"을 나타냅니다 EOF.)
원인 : 불균형
{
및}
코드 블록 / 및 함수 또는 클래스 선언.
그건 거의 항상 누락에 대해 }
앞의 코드 블록을 닫습니다 중괄호.
다시 말하지만 적절한 들여 쓰기를 사용하여 이러한 문제를 방지하십시오.
대괄호 일치가있는 IDE를 사용하여
}
잘못된 위치를 찾으십시오 . 대부분의 IDE 및 텍스트 편집기에는 키보드 단축키가 있습니다.- NetBeans, PhpStorm, Komodo : Ctrl[및Ctrl]
- Eclipse, Aptana : CtrlShiftP
- Atom, Sublime : Ctrlm-Zend StudioCtrlM
- Geany, 메모장 ++ :-Joe CtrlB: CtrlG-Emacs : C-M-n-Vim :%
대부분의 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 문자열이 파일의 끝까지 계속된다고 가정합니다 (따라서 "Unexpected $ end"). 거의 모든 IDE와 구문 강조 편집기가이를 명백하게하거나 경고합니다.
이스케이프 된 따옴표
\
문자열로 사용 하면 특별한 의미가 있습니다. 이것을 " 이스케이프 문자 "라고하며 일반적으로 파서에게 다음 문자를 문자 그대로 가져 오도록 지시합니다.
예 : echo 'Jim said \'Hello\'';
인쇄됩니다Jim said 'hello'
문자열의 닫는 따옴표를 이스케이프하면 닫는 따옴표가 의도 한대로가 아니라 문자 그대로 사용됩니다. 즉, 문자열을 닫지 않고 문자열의 일부로 인쇄 가능한 따옴표로 사용됩니다. 이것은 일반적으로 다음 문자열을 연 후 또는 스크립트 끝에서 구문 분석 오류로 표시됩니다.
Windows에서 경로를 지정할 때 매우 일반적인 오류 : "C:\xampp\htdocs\"
잘못되었습니다. 당신은 필요합니다 "C:\\xampp\\htdocs\\"
.
대체 구문
템플릿에서 명령문 / 코드 블록에 대한 대체 구문을 사용할 때이 구문 오류를 볼 수있는 경우는 다소 드뭅니다. 사용 if:
및 else:
및 누락 endif;
, 예를 들면.
또한보십시오:
- PHP 구문 오류 "예기치 않은 $ end"
- 구문 분석 오류 : 구문 오류, PHP 코드에서 예기치 않은 파일 끝
- PHP를 사용하여 구문 분석 오류 구문 오류 예기치 않은 파일 끝
- PHP 구문 분석 오류 : 구문 오류, CodeIgniter보기에서 예기치 않은 파일 끝
- 구문 분석 오류 : 구문 오류, 예기치 않은 파일 끝 (등록 스크립트)
- "구문 분석 오류 : 구문 오류, 예기치 않은 $ end"내 Uni 등록 할당의 경우
- PHP 오류 수정 : PHP 오류 # 3 : 예기치 않은 파일 끝
예상치 못한 T_IF
예상치 못한 T_ELSEIF
예상치 못한 T_ELSE
예상치 못한 T_ENDIF
조건부 제어 블록 if
, elseif
및 else
간단한 구조를 따릅니다. 구문 오류가 발생하면 {
중괄호 가 누락 }
되거나 너무 많은 블록 중첩이 잘못되었을 가능성이 큽니다 .
누락
{
되었거나}
잘못된 들여 쓰기로 인해일치하지 않는 코드 중괄호는 다음과 같이 형식이 잘못된 코드에 일반적입니다.
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
표현식 을 방지하려면 임시 변수 또는 함수를 사용하십시오 .IF
식에서 사용할 수 없습니다.놀랍도록 빈번한 새로운 실수는
if
print 문과 같은 식에서 문 을 사용하려고하는 것입니다 .⇓ echo "<a href='" . if ($link == "example.org") { echo …
물론 유효하지 않습니다.
삼항 조건부를 사용할 수 있지만 가독성에주의하십시오.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
그렇지 않으면 이러한 출력 구조가 끊어집니다. 여러
if
s 및echo
s를 사용하십시오 .
더 좋은 방법은 임시 변수를 사용 하고 다음 앞에 조건문을 배치하는 것입니다.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 in If
당신은 할 수 없습니다 둥지
if
중 하나의 조건 내에서 :⇓ if ($x == true and (if $y != false)) { ... }
and
(또는or
)이 이미 연결 비교를 허용 하기 때문에 분명히 중복 됩니다.Forgotton
;
세미콜론한 번 더 : 각 제어 블록은 명령문이어야합니다. 이전 코드 조각이 세미콜론으로 종료되지 않으면 이는 보장 된 구문 오류입니다.
⇓ $var = 1 + 2 + 3 if (true) { … }
Btw,
{…}
코드 블록 의 마지막 줄에도 세미콜론이 필요합니다.세미콜론이 너무 빠름
이제이 함정은 간과하기가 너무 쉽기 때문에 특정 코딩 스타일을 비난하는 것은 잘못된 것일 수 있습니다.
⇓ 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
구문 지점을.- 표현식 을 종료하면
코드 블록을 사용하지 않음
구문 중괄호를 생략 할 수있어
{
...}
코드 블록에 대한if
/elseif
/else
분기합니다. 슬프게도 정통한 코더에게 매우 일반적인 구문 스타일입니다. (잘못된 가정하에 이것은 입력하거나 읽는 것이 더 빠릅니다).그러나 그것은 구문을 넘어 뜨릴 가능성이 높습니다. 조만간 추가 명령문이 if / else 분기로 이동합니다.
if (true) $x = 5; elseif (false) $x = 6; $y = 7; ← else $z = 0;
그러나 실제로 코드 블록을 사용하려면 … 그대로 작성 해야 합니다 !
{
}
노련한 프로그래머조차도이 중괄호없는 구문을 피하거나 최소한 규칙에 대한 예외적 인 예외로 이해합니다.
Else / Elseif의 순서가 잘못됨
자신에게 상기시켜야 할 한 가지는 물론 조건부 순서 입니다.
if ($a) { … } else { … } elseif ($b) { … } ↑
elseif
원하는만큼을 가질 수 있지만else
마지막으로 가야 합니다. 그것이 바로 그 방법입니다.클래스 선언
마찬가지로 위에서 언급 한 , 당신은 클래스 선언에서 제어 명령을 가질 수 없습니다 :
class xyz { if (true) { function ($var) {} }
예상치 못한 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 } ?>
이것은 아마도 잘못된 코딩 의도를 기반으로하는 잘못된 들여 쓰기의 다소간 변형입니다. 및 / 구조 토큰 사이에 다른 문을 매시
할 수 없습니다 .if
elseif
else
if (true) { } echo "in between"; ← elseif (false) { } ?> text <?php ← else { }
둘 중 하나는
{…}
제어 구조 토큰 사이가 아니라 코드 블록 에서만 발생할 수 있습니다 .- 어차피 말이 안 돼요. 일부 "정의되지 않은"상태가 있다고 PHP가 사이에 점프 할 때처럼 아니에요
if
및else
분기합니다. - print 문이 어디에 속하는지 / 또는 두 가지 모두에서 반복되어야 하는지를 결정해야합니다.
다른 제어 구조간에 if / else를 분리 할 수도 없습니다 .
foreach ($array as $i) { if ($i) { … } } else { … }
더 없다 통 사적 관계 사이
if
및else
.foreach
에서 어휘 범위의 끝}
, 그래서에 대한 포인트가 없습니다if
구조를 계속합니다.- 어차피 말이 안 돼요. 일부 "정의되지 않은"상태가 있다고 PHP가 사이에 점프 할 때처럼 아니에요
T_ENDIF
예상치 못한 T_ENDIF에 대해 불만이 제기되면 대체 구문 스타일
if:
⋯elseif:
⋯else:
⋯을 사용하는 것endif;
입니다. 정말 두 번 생각해야합니다.일반적인 함정은 세미콜론에 대해 어리석게 유사한
:
콜론을;
혼동하는 것 입니다. ( "세미콜론이 너무 이르다"에 포함됨)템플릿 파일에서 들여 쓰기를 추적하기가 더 어렵 기 때문에 대체 구문을 사용할 때 더 많이 사용할
endif;
수if:
있습니다.사용
} endif;
은 두 배의if
종결 자입니다.
"예기치 않은 $ end"는 일반적으로 잊어 버린 닫는
}
중괄호 의 가격입니다 .할당 vs. 비교
따라서 이것은 구문 오류가 아니지만이 컨텍스트에서 언급 할 가치가 있습니다.
⇓ if ($x = true) { } else { do_false(); }
그것은
==
/===
비교가 아니라=
할당 입니다. 이것은 다소 미묘하며 일부 사용자가 전체 조건 블록을 무력하게 편집하도록 쉽게 이끌 것입니다. 논리 오류 / 오작동이 발생할 때마다 의도하지 않은 할당을 먼저 조심하십시오.
예상치 못한 T_IF
예상치 못한 T_FOREACH
예상치 못한 T_FOR
예상치 못한 T_WHILE
예상치 못한 T_DO
예상치 못한 T_ECHO
컨트롤은이 같은 구축 if
, foreach
, for
, while
, list
, global
, return
, do
, print
, echo
문에만 사용할 수있다. 그들은 일반적으로 스스로 한 줄에 상주합니다.
세미콜론; 어디 있니?
파서가 제어문에 대해 불평하는 경우 일반적으로 이전 줄에서 세미콜론 을 놓친 적이 있습니다 .
⇓ $x = myfunc() if (true) {
솔루션 : 이전 줄을 살펴보십시오. 세미콜론을 추가하십시오.
클래스 선언
이것이 발생하는 또 다른 위치 는 클래스 선언 입니다. 클래스 섹션에서는 속성 초기화 및 메서드 섹션 만 나열 할 수 있습니다. 거기에 코드가있을 수 없습니다.
class xyz { if (true) {} foreach ($var) {}
이러한 구문 오류는 일반적으로 잘못 중첩 된
{
및}
. 특히 기능 코드 블록이 너무 일찍 닫 혔을 때.식 컨텍스트의 문
대부분의 언어 구조는 명령문으로 만 사용할 수 있습니다 . 다른 표현식 안에 배치 할 수 없습니다.
⇓ $var = array(1, 2, foreach($else as $_), 5, 6);
마찬가지로
if
in 문자열, 수학 표현식 또는 다른 곳에서 사용할 수 없습니다 .⇓ print "Oh, " . if (true) { "you!" } . " won't work"; // Use a ternary condition here instead, when versed enough.
if
특히 표현식에 유사 조건을 포함 하려면?:
삼항 평가 를 사용하는 것이 좋습니다 .동일 적용
for
,while
,global
,echo
그리고 낮은 확장list
.⇓ echo 123, echo 567, "huh?";
반면
print()
표현식 컨텍스트에서 사용할 수있는 언어 내장입니다. (그러나 거의 의미가 없습니다.)식별자로 예약 된 키워드
또한 사용자 정의 함수 또는 클래스 이름에 대해
do
또는if
및 기타 언어 구성을 사용할 수 없습니다 . (아마도 PHP7 일 것입니다.하지만 그래도 권장하지 않습니다.)
예상치 못한 T_IS_EQUAL
예상치 못한 T_IS_GREATER_OR_EQUAL
예상치 못한 T_IS_IDENTICAL
예상치 못한 T_IS_NOT_EQUAL
예상치 못한 T_IS_NOT_IDENTICAL
예상치 못한 T_IS_SMALLER_OR_EQUAL
예상치 <
못한 예상치 못한>
같은 비교 연산자는 ==
, >=
, ===
, !=
, <>
, !==
및 <=
또는 <
과 >
대부분 같은 단지 표현에 사용되어야 if
표현. 파서가 이에 대해 불평하면 종종 잘못된 페어링 또는 일치하지 않는 (
)
괄호를 의미합니다.
괄호 그룹화
특히
if
여러 비교 가있는 문의 경우 여는 괄호와 닫는 괄호 를 올바르게 계산해야합니다 .⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
여기의
if
조건은 이미)
비교가 충분히 복잡해지면이를 여러 개의 중첩 된
if
구조 로 분할하는 것이 종종 도움이됩니다 .isset () 비교
일반적인 신인은 pitfal이 결합
isset()
하거나empty()
비교 하려고 시도하는 것입니다.⇓ if (empty($_POST["var"] == 1)) {
또는:
⇓ if (isset($variable !== "value")) {
때문에, PHP 이해가되지 않습니다
isset
및empty
유일한 변수 이름을 허용 언어 구조이다. 출력이 단지 / 이미 부울이기 때문에 결과를 비교하는 것도 의미가 없습니다.>=
크거나 같음=>
배열 연산자 와 혼동두 연산자는 다소 비슷해 보이므로 때때로 혼동됩니다.
⇓ if ($var => 5) { ... }
이 비교 연산자를 " 보다 크 거나 같음 " 이라고 만 기억 하면됩니다.
참조 : PHP의 If 문 구조
비교할 것이 없습니다
동일한 변수 이름과 관련된 두 비교를 결합 할 수도 없습니다.
⇓ if ($xyz > 5 and < 100)
PHP는 초기 변수를 다시 비교하려고했다고 추론 할 수 없습니다. 식에있어서 보통 쌍으로 운영자 우선 따라서이 때에는,
<
볼, 원래의 변수에서 왼쪽 만 부울 결과가 될 것이다.비교 체인
연산자 행이있는 변수와 비교할 수 없습니다.
⇓ $reult = (5 < $x < 10);
이것은 각각에 대한 두 개의 비교로 나눠 져야
$x
합니다.이것은 실제로 블랙리스트 표현식의 경우에 더 가깝습니다 (동등한 연산자 연관성 때문에). 몇 가지 C 스타일 언어에서 구문 론적으로 유효하지만 PHP는 예상되는 비교 체인으로 해석하지도 않습니다.
예상치
>
못한 예상치 못한<
보다 큼
>
또는보다 작음<
연산자에는 사용자 지정T_XXX
토크 나이저 이름 이 없습니다 . 그리고 그것들은 다른 것들처럼 잘못 배치 될 수 있지만, 파서가 잘못 인용 된 문자열과 으깬 HTML에 대해 불평하는 것을 더 자주 볼 수 있습니다.⇓ print "<a href='z">Hello</a>"; ↑
이것은 리터럴 상수 와
"<a href='z"
비교 되는 문자열 과 다른 비교에 해당합니다. 아니면 적어도 PHP가 보는 방식입니다. 실제 원인과 구문 오류는 너무 이른 문자열 종료였습니다.>
Hello
<
"
PHP 시작 태그를 중첩 할 수도 없습니다.
<?php echo <?php my_func(); ?> ↑
또한보십시오:
- PHP 예기치 않은 T_IS_NOT_EQUAL 오류
- 구문 오류, 예상치 못한 T_IS_EQUAL
- return 문에 구문 오류가 있습니다.
- http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identical-expecting-or/
예기치 않은 '?'
??
PHP 7 이전 버전의 PHP에서 null 병합 연산자를 사용하려고 하면이 오류가 발생합니다.
<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP
예기치 않은 '?', 변수 필요
다음과 같이 nullable 형식에 대해서도 유사한 오류가 발생할 수 있습니다.
function add(?int $sum): ?int {
다시 한 번 오래된 PHP 버전이 사용되고 있음을 나타냅니다 (CLI 버전 php -v
또는 웹 서버 바인딩 버전 phpinfo();
).
예상치 못한 T_LNUMBER
토큰 T_LNUMBER
은 "긴"/ 숫자를 나타냅니다.
잘못된 변수 이름
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
).
스트레이 어레이 항목
쉼표 가 누락 된 경우 배열 선언에 대해 예기치 않은 long이 발생할 수도 있습니다
,
.# ↓ ↓ $xy = array(1 2 3);
또는 마찬가지로 함수 호출 및 선언 및 기타 구성 :
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
따라서 일반적으로 목록이나 표현식을 분리하는 데 하나
;
또는,
누락 된 항목이 있습니다.잘못 인용 된 HTML
다시 말하지만, 잘못 인용 된 문자열 은 잘못된 숫자의 빈번한 소스입니다.
# ↓ ↓ echo "<td colspan="3">something bad</td>";
이러한 경우는 예상치 못한 T_STRING 오류 와 비슷하게 처리되어야 합니다.
기타 식별자
함수, 클래스, 네임 스페이스 는 모두 숫자로 시작하는 이름을 지정할 수 없습니다.
↓ function 123shop() {
변수 이름과 거의 동일합니다.
예기치 않은 '='
이는 변수 이름에 잘못된 문자가있는 경우 발생할 수 있습니다. 변수 이름 은 다음 규칙을 따라야합니다.
변수 이름은 PHP의 다른 레이블과 동일한 규칙을 따릅니다. 유효한 변수 이름은 문자 또는 밑줄로 시작하고 그 뒤에 임의의 숫자, 숫자 또는 밑줄이 이어집니다. 정규 표현식으로 다음과 같이 표현됩니다. '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'
예기치 않은 '계속'(T_CONTINUE)
continue
문 (예 : for 또는 if)이며 독립형으로 표시되어야합니다. 표현식의 일부로 사용할 수 없습니다. 부분적으로 continue는 값을 반환하지 않지만 표현식에서 모든 하위 표현식은 일부 값을 가져야 전체 표현식이 값을 생성하기 때문입니다. 그것이 진술과 표현의 차이입니다.
즉 continue
, 삼항 문이나 반환 값이 필요한 문에는 사용할 수 없습니다.
예기치 않은 '휴식'(T_BREAK)
break;
물론 마찬가지입니다 . 또한 표현식 컨텍스트에서 사용할 수 없지만 엄격한 문 ( foreach
또는 if
블록 과 동일한 수준 )입니다.
예기치 않은 '반품'(T_RETURN)
이제 이것은의 경우 더 놀랍지 return
만 블록 수준의 문 이기도 합니다 . 더 높은 범위 / 함수에 값 (또는 NULL)을 반환하지만 표현식 자체로 평가되지는 않습니다. → 즉, 아무 의미가 없습니다.return(return(false);;
예기치 않은 '종료'(T_ENDWHILE)
구문은 콜론을 사용하고 있습니다. 콜론이 없으면 위의 오류가 발생합니다.
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
이 구문의 대안은 중괄호를 사용하는 것입니다.
<?php while($query->fetch()) { ?>
....
<?php } ?>
http://php.net/manual/en/control-structures.while.php
시작되는 오류 메시지 Parse error: syntax error, unexpected ':'
는 클래스 정적 참조 Class::$Variable
를 Class:$Variable
.
참고 URL : https://stackoverflow.com/questions/18050071/php-parse-syntax-errors-and-how-to-solve-them
'Nice programing' 카테고리의 다른 글
속성 이름을 포함하는 변수로 개체 속성이 있는지 확인하는 방법은 무엇입니까? (0) | 2020.10.02 |
---|---|
로컬 Git 변경 사항을 제거하는 다양한 방법 (0) | 2020.10.02 |
원시 유형은 무엇이며 왜 사용하지 않아야합니까? (0) | 2020.10.02 |
SQL 조인 : where 절 대 on 절 (0) | 2020.10.02 |
pg_config 실행 파일을 찾을 수 없습니다. (0) | 2020.10.02 |