PHP 구문 분석/구문 오류 및 해결 방법
누구나 구문 오류가 발생합니다.경험이 많은 프로그래머들도 오타를 칩니다.신입사원들에게 그것은 단지 학습 과정의 일부일 뿐이다.그러나 다음과 같은 오류 메시지를 쉽게 해석할 수 있습니다.
PHP 구문 분석 오류: 구문 오류, 20행의 index.php에 예기치 않은 '{'가 있습니다.
뜻밖의 상징이 항상 진범은 아니다.하지만 이 줄 번호는 어디서부터 찾아야 할지 대략적으로 알려줍니다.
항상 코드 컨텍스트를 살펴보십시오.구문 오류는 종종 언급된 코드 행 또는 이전 코드 행에 숨겨집니다.코드를 매뉴얼의 구문 예제와 비교합니다.
모든 케이스가 서로 일치하는 것은 아니지만요.그러나 구문 오류를 해결하기 위한 몇 가지 일반적인 단계가 있습니다.이 참고 자료에는 일반적인 함정이 요약되어 있습니다.
예기치 않은 T_CONSTANT_ENCAPSED_STRING
예기치 않은 T_ENCRAPSED_AND_WHITESPACE예기치 않은 T_FUNITION...
예기치 않은 T_한다면
예기치 않은 T_FORACH
예기치 않은 T_FOR
예기치 않은 T_WHILE
예기치 않은 T_DO
예기치 않은 T_PRINT
예기치 않은 T_ECHO예기치 않은 T_PAAMAYIM_NEKUDOTAYIM...
예기치 않은 '퍼블릭'(T_PUBLIC) 예기치 않은 '프라이빗'(T_PRIVATE) 예기치 않은 '보호'(T_PROTECTED) 예기치 않은 '최종'(T_FINAL)...
예기치 않은 T_STATIC...
예기치 않은 T_CLASS...
의외의
,
(표준)검출되지 않다
.
(기간)의외의
;
(온)의외의
*
(표준)의외의
:
(표준)예기치 않은(콜 시간 패스 바이 레퍼런스)
밀접하게 관련된 참고 자료:
그리고:
Stack Overflow도 신입 코더를 환영하지만 대부분 전문적인 프로그래밍 질문을 대상으로 합니다.
- 모든 사람의 코딩 실수와 좁은 오타에 답하는 것은 대부분 주제에서 벗어난 것으로 여겨진다.
- 따라서 구문 수정 요청을 게시하기 전에 시간을 내어 기본 단계를 따르십시오.
- 그래도 해야 하는 경우, 해결 이니셔티브, 시도된 수정, 그리고 무엇이 잘못되었는지에 대한 사고 과정을 보여 주십시오.
브라우저에 "SyntaxError: unlograte character"와 같은 오류 메시지가 표시되면 실제로는 php 관련 오류가 아니라 javascript-syntax 오류입니다.
벤더 코드에서 발생한 구문 오류:마지막으로 코드베이스를 편집하여 구문 오류가 발생하지 않았지만 외부 벤더 패키지의 설치 또는 업그레이드 후 PHP 버전의 비호환성 때문일 수 있으므로 플랫폼 설정에 대한 벤더의 요건을 확인하십시오.
구문 오류란 무엇입니까?
PHP는 C 스타일의 필수 프로그래밍 언어에 속합니다.이 명령어에는 엄밀한 문법 규칙이 있어 잘못된 기호나 식별자가 발견되면 복구할 수 없습니다.코딩 의도를 추측할 수 없습니다.
가장 중요한 힌트
항상 취할 수 있는 몇 가지 기본적인 주의사항이 있습니다.
적절한 코드 들여쓰기를 사용하거나 높은 코드 스타일을 사용합니다.가독성은 불규칙성을 방지합니다.
구문 강조 표시가 있는 PHP용 IDE 또는 편집기를 사용합니다.괄호/브래킷 밸런싱에도 도움이 됩니다.
파서 오류 해석 방법
일반적인 구문 오류 메시지는 다음과 같습니다.
해석 오류: 구문 오류, 예기치 않은 T_STRING, 파일에 "이(
;
가) 있어야 합니다.217행의 php
여기에는 구문 오류의 가능성이 있는 위치가 나열됩니다.상기의 파일명과 행 번호를 참조해 주세요.
다음과 같은 별명이 있다.T_STRING
에 파서/파사이저가 최종적으로 처리하지 못한 기호를 나타냅니다.단, 이것이 반드시 구문 오류의 원인은 아닙니다.
이전의 코드 라인도 조사하는 것이 중요합니다.구문 오류는 이전에 발생한 사고일 뿐입니다.에러 행 번호는 파서가 모든 처리를 최종적으로 포기한 장소입니다.
구문 오류 해결
구문의 딸꾹질을 좁혀 수정하는 방법은 많이 있습니다.
위의 소스 파일을 엽니다.언급된 코드 라인을 보세요.
가출 문자열 및 잘못된 연산자의 경우 일반적으로 여기서 범인을 찾을 수 있습니다.
왼쪽에서 오른쪽으로 줄을 읽고 각 기호가 무엇을 하는지 상상해 보세요.
앞줄도 좀 더 규칙적으로 볼 필요가 있어요.
특히, 미싱
;
이전 줄 끝/문에 세미콜론이 없습니다(적어도 스타일 관점에서).)한다면
{
코드 블록}
올바르게 닫히거나 중첩되지 않은 경우 소스 코드를 더 자세히 조사해야 할 수 있습니다.적절한 코드 들여쓰기를 사용하여 이를 단순화하십시오.
구문 색칠을 보세요!
문자열, 변수 및 상수는 모두 다른 색상을 가져야 합니다.
연산자
+-*/.
또렷하게 물들여야 합니다.그렇지 않으면 잘못된 컨텍스트에 있을 수 있습니다.문자열 색칠이 너무 길거나 너무 짧으면 에스케이프되지 않았거나 누락된 닫힘을 발견한 것입니다.
"
또는'
스트링 마커두 개의 같은 색깔의 구두점 문자가 나란히 있는 것도 문제를 의미할 수 있습니다.보통 운영자는 그렇지 않으면 혼자입니다.
++
,--
, 또는 연산자 뒤에 괄호가 표시됩니다.대부분의 경우 서로 바로 이어지는2개의 문자열/식별자가 올바르지 않습니다.
공백은 당신의 친구입니다.임의의 코딩 스타일을 따릅니다.
긴 줄을 일시적으로 끊어라.
연산자 또는 상수와 문자열 사이에 새 선을 자유롭게 추가할 수 있습니다.다음으로 파서는 해석 오류의 행 번호를 구체화합니다.매우 긴 코드를 보는 대신 누락되거나 잘못된 구문 기호를 분리할 수 있습니다.
콤플렉스를 분할하다
if
구별되거나 내포된 진술if
조건들.긴 수학 공식이나 논리 사슬 대신 임시 변수를 사용하여 코드를 단순화하십시오(가독성 향상 = 오류 감소).
다음 사이에 새 줄 추가:
- 쉽게 식별할 수 있는 암호는
- 잘 모르는 부분은
- 그리고 파서가 불평하는 선들.
긴 코드 블록을 분할하면 구문 오류의 발생원을 찾는 데 큰 도움이 됩니다.
위반 코드를 코멘트합니다.
문제의 원인을 특정할 수 없는 경우는, 코드의 블록을 코멘트 아웃(일시적으로 삭제)하기 시작합니다.
해석 오류를 해결하자마자 문제의 원인을 발견했습니다.더 자세히 보세요.
때로는 완전한 기능/방법 블록을 일시적으로 제거해야 할 수도 있습니다.(중괄호가 일치하지 않거나 코드가 잘못 입력된 경우)
구문 문제를 해결할 수 없는 경우 주석 처리된 섹션을 처음부터 다시 쓰십시오.
신참자는 혼란스러운 구문 구조를 피하십시오.
삼진법
? :
condition 연산자는 코드를 압축할 수 있으며 매우 유용합니다.그러나 모든 경우에 가독성에 도움이 되는 것은 아닙니다.플레인 선호if
설명되지 않은 상태에서의 스테이트먼트.PHP의 대체 구문(
if:
/elseif:
/endif;
)는 템플릿에 공통적이지만 일반보다 따르기가 쉽지 않습니다.{
코드}
블록.
가장 일반적인 신규 실수는 다음과 같습니다.
세미콜론이 없습니다.
;
끝문/행의 경우.일치하지 않는 문자열 따옴표
"
또는'
그 안에 인용문구를 빼놓지 않고 써넣기.특히 문자열에 대해 잊은 연산자
.
연결언밸런스
(
괄호)
. 보고된 행에 그것들을 세어 주세요.같은 수가 있나요?
하나의 구문 문제를 해결하면 다음 문제가 밝혀질 수 있다는 것을 잊지 마십시오.
하나의 문제가 해결되고 다른 문제가 아래의 코드로 해결된다면 대부분 올바른 방향으로 가고 있는 것입니다.
새 구문 오류를 편집한 후 동일한 행에 나타나는 경우 변경 시도가 실패했을 수 있습니다(다만 항상 그런 것은 아닙니다).
수정할 수 없는 경우 이전에 작동하던 코드의 백업을 복원합니다.
- 소스 코드 버전 관리 시스템을 채택합니다.언제든지 볼 수 있습니다.
diff
최신 버전입니다.구문의 문제가 무엇인지에 대한 계몽이 될 수 있습니다.
- 소스 코드 버전 관리 시스템을 채택합니다.언제든지 볼 수 있습니다.
보이지 않는 유니코드 문자:경우에 따라 소스에서 16진수 에디터 또는 다른 에디터/뷰어를 사용해야 합니다.코드만 보고는 찾을 수 없는 문제가 있습니다.
비 ASC를 찾기 위한 첫 번째 척도로 시도합니다.II 기호
특히 BOM, 폭 0의 공백 또는 구분되지 않는 공백과 스마트 따옴표는 정기적으로 소스 코드에 삽입됩니다.
파일에 저장되는 줄 바꿈 유형을 관리합니다.
PHP는 캐리지 리턴이 아니라 줄바꿈만 존중합니다.
MacOS 사용자(OS X에서도 잘못 구성된 편집기의 경우)에게 문제가 될 수 있습니다.
단일 회선일 때만 문제가 되는 경우가 많습니다.
//
또는#
코멘트가 사용됩니다.멀티라인/*...*/
회선 브레이크가 무시되어도 코멘트는 파서를 방해하지 않습니다.
구문 오류가 웹을 통해 전송되지 않는 경우:시스템에 구문 오류가 있을 수 있습니다.하지만 동일한 파일을 온라인에 게시하면 더 이상 표시되지 않습니다.두 가지 중 하나만 의미할 수 있습니다.
잘못된 파일을 보고 있습니다!
또는 코드에 보이지 않는 왜곡된 유니코드(위 참조)가 포함되어 있을 수 있습니다.쉽게 알 수 있습니다.웹 폼에서 텍스트 에디터로 코드를 복사하기만 하면 됩니다.
PHP 버전을 확인합니다.모든 구문 구조를 모든 서버에서 사용할 수 있는 것은 아닙니다.
php -v
명령줄 인터프리터용<?php phpinfo();
웹 서버를 통해 호출된 명령어입니다.
꼭 같은 것은 아닙니다.특히 프레임워크에 대해 작업할 때는 그에 맞춰 작업해야 합니다.시행착오는 최후의 수단이다.
다른 모든 작업이 실패하면 언제든지 오류 메시지를 구글로 검색할 수 있습니다.구문 기호는 검색하기가 쉽지 않습니다(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
mod_php 또는 Fast CGI 셋업에서는 일반적으로 또는 via를 사용합니다.
PHP는 첫 번째 줄을 해석/실행할 수 없기 때문에 손상된 스크립트 내에서 활성화하는 것은 너무 늦습니다.간단한 회피책은 래퍼 스크립트를 작성하는 것입니다.test.php
:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
그런 다음 이 래퍼 스크립트에 액세스하여 실패한 코드를 호출합니다.
또, PHP 의 유효화에도 도움이 됩니다.error_log
HTTP 500 응답으로 스크립트가 크래쉬 했을 때 웹 서버를 조사합니다.
나는 이 주제가 완전히 지나치게 논의되고 있다고 생각한다.구문 오류를 완전히 방지하려면 IDE를 사용하는 것이 좋습니다.아이디 없이 일하는 건 프로답지 않다고 말할 수 있어요. 왜요?최신 IDE는 입력할 때마다 구문을 체크하기 때문입니다.코드를 입력했을 때 행 전체가 빨간색으로 바뀌고 구문 오류의 정확한 유형과 위치가 큰 경고 메시지가 표시되면 다른 솔루션을 검색할 필요가 전혀 없습니다.
구문 검사 IDE는 다음을 의미합니다.
입력 시 구문 오류가 제대로 표시된다는 이유만으로 구문 오류가 다시 발생하지 않습니다.정말이에요.
구문 검사 기능이 뛰어난 IDE(모두 Linux, Windows 및 Mac에서 사용 가능):
- NetBeans [무료]
- PHPSTorm [199달러]
- 이클립스(PHP 플러그인 포함) [무료]
- Sublime [$80 USD] (주로 텍스트 에디터이지만 PHP 구문 파서와 같은 플러그인으로 확장 가능)
의외의[
요즘 생각지도 못한 일이[
어레이 브래킷은 오래된 PHP 버전에서 흔히 볼 수 있습니다.짧은 배열 구문은 PHP > = 5.4 이후부터 사용할 수 있습니다.이전 설치에서는 지원만 가능array()
.
$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
⇑
어레이 함수 결과 참조도 마찬가지로 이전 버전의 PHP에서는 사용할 수 없습니다.
$result = get_whatever()["key"];
⇑
참조 - 이 오류는 PHP에서 무엇을 의미합니까? - "Syntax error, unexpected"는 가장 일반적이고 실용적인 해결 방법을 보여줍니다.
단, PHP 설치를 업그레이드하는 것이 항상 더 좋습니다.공유 웹 호스팅 계획의 경우, 예를 들어 다음과 같은 경우 먼저 조사하십시오. SetHandler php56-fcgi
를 사용하여 새로운 실행 시간을 활성화할 수 있습니다.
다음 항목도 참조하십시오.
- 참조 함수 결과에 대한 PHP 구문 → PHP 5.4에서 사용 가능
- PHP 구문 오류, 예기치 않은 '['
- 어레이의 줄임말: {} 또는 []와 같은 리터럴 구문이 있습니까?
- PHP 5.3.10 vs PHP 5.5.3 구문 오류 예기치 않은 '['
- PHP array()와 []의 차이점
- PHP 배열 구문 구문 분석 오류 왼쪽 대괄호 ""
참고로, 오래된 PHP 버전과 느린 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_VARILE
'예상치 못한'T_VARIABLE
"는 문자 그대로가 있음을 의미합니다.$variable
현재 표현식/문 구조에 맞지 않는 이름.
세미콜론이 없습니다.
일반적으로 앞줄에 세미콜론이 없음을 나타냅니다.다음 문 뒤에 있는 변수 할당은 참조할 수 있는 좋은 지표입니다.
⇓ func1() $var = 1 + 2; # parse error in line +2
문자열 연결
자주 일어나는 불상사는 잊혀진 줄과 연결된 것이다.
.
연산자:⇓ print "Here comes the value: " $value;
참고로 읽기 쉽도록 문자열 보간(큰따옴표로 둘러싸인 기본 변수)을 사용해야 합니다.이렇게 하면 구문 문제를 피할 수 있습니다.
문자열 보간은 스크립트 언어의 핵심 기능입니다.그것을 이용하는 것은 부끄러운 일이 아니다.변수에 대한 마이크로 최적화 조언 무시
.
연결 속도가 더 빠릅니다.아니에요.식 연산자가 없습니다.
물론 산술 연산과 같은 다른 식에서도 동일한 문제가 발생할 수 있습니다.
⇓ print 4 + 7 $var;
여기서 PHP는 변수를 추가, 감산 또는 비교해야 하는지 여부를 추측할 수 없습니다.
리스트
구문 목록(어레이 모집단 등)도 동일하지만 파서가 예상된 쉼표를 나타냅니다.
,
예를 들어 다음과 같습니다.⇓ $var = array("1" => $val, $val2, $val3 $val4);
또는 함수 파라미터 목록:
⇓ function myfunc($param1, $param2 $param3, $param4)
이것은, 다음과 같이 생각할 수 있습니다.
list
또는global
스테이트먼트, 또는 스테이트먼트가 부족한 경우;
세미콜론for
고리.클래스 선언
이 파서 오류는 클래스 선언에서도 발생합니다.식이 아닌 정적 상수만 할당할 수 있습니다.따라서 파서는 변수에 대해 할당된 데이터로 불만을 제기합니다.
class xyz { ⇓ var $value = $_GET["input"];
타의 추종을 불허하다
}
특히 여기서 컬리 브레이스를 닫을 수 있습니다.메서드가 너무 일찍 종료된 경우(적절한 들여쓰기 사용!), 일반적으로 클래스 선언 본문에 스트레이 변수가 잘못 배치됩니다.식별자 뒤의 변수
⇓ $this->myFunc$VAR();
참고로, 이것은 변수 변수를 사용하려는 의도가 있었던 일반적인 예입니다.이 경우 변수 속성 검색:
$this->{"myFunc$VAR"}();
예를들면.변수 사용은 예외여야 합니다.어레이가 더 심플하고 적절한 경우에도 새로운 고객은 너무 쉽게 사용하려고 합니다.
언어 구성 후 괄호 누락
급하게 입력하면 다음 괄호를 열거나 닫는 것을 잊어버릴 수 있습니다.
if
그리고.for
그리고.foreach
스테이트먼트:⇓ foreach $array as $key) {
해결책: 누락된 개구부 추가
(
문과 변수 사이에 있습니다.⇓ if ($var = pdo_query($sql) { $result = …
곱슬머리
{
중괄호는 코드 블록을 열지 않습니다.if
와의 표현)
괄호를 먼저 닫으십시오.그렇지 않으면 조건을 예상하지 않습니다.
⇓ else ($var >= 0)
솔루션:조건을 삭제하다
else
또는 를 사용합니다.닫는 데 괄호 필요
⇓ function() use $var {}
솔루션:주위에 괄호 추가
$var
.보이지 않는 공백
"보이지 않는 유니코드"에 대한 참조 답변(예: 중단되지 않는 공간)에서 언급되었듯이, 다음과 같은 예기치 않은 코드에 대해서도 이 오류가 나타날 수 있습니다.
<?php ⇐ $var = new PDO(...);
파일의 시작이나 카피 앤 페이스트 코드에 많이 사용되고 있습니다.육안으로 보기에 구문의 문제가 없는 것 같으면 16진수 편집기로 확인합니다.
「 」를 참조해 주세요.
예기치 않은 T_CONSTANT_ENCAPSED_STRING
예기치 않은 T_ENCRAPSED_AND_WHITESPACE
다루기 힘든 이름들T_CONSTANT_ENCAPSED_STRING
그리고.T_ENCAPSED_AND_WHITESPACE
인용 문헌을 참조하다
이들은 다른 맥락에서 사용되지만 구문 문제는 매우 유사합니다.T_ENCAPSED…경고는 이중 따옴표로 묶인 문자열 컨텍스트에서 발생하는 반면 T_CONST… 문자열은 보통 PHP 식이나 문장에서 잘못 표시됩니다.
잘못된 변수 보간
또한 잘못된 PHP 변수 보간으로 인해 가장 자주 발생합니다.
⇓ ⇓ echo "Here comes a $wrong['array'] access";
PHP 컨텍스트에서는 어레이 키의 따옴표는 필수입니다.그러나 이중 따옴표로 묶인 문자열(또는 GEEDOCs)에서는 이는 실수입니다.파서는 인용된 단일 인용문에 대해 불평합니다.
'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
는 문자열 파라미터로 되어 있었습니다.어레이 리스트
A를 놓치면
,
배열 작성 블록의 콤마에서 파서는 다음 두 개의 연속된 문자열을 봅니다.array( ⇓ "key" => "value" "next" => "....", );
마지막 줄에는 항상 쉼표가 추가될 수 있지만 중간에 쉼표를 놓치는 것은 허용되지 않습니다.구문 강조 표시 없이는 찾기 어렵습니다.
함수 파라미터 리스트
⇓ myfunc(123, "text", "and" "more")
런어웨이 스트링
일반적인 바리에이션은 완전히 잊혀진 문자열 터미네이터입니다.
⇓ mysql_evil("SELECT * FROM stuffs); print "'ok'"; ⇑
여기서 PHP는 두 문자열 리터럴이 서로 바로 이어지는 것에 대해 불평합니다.하지만 진짜 원인은 물론 종결되지 않은 이전 문자열입니다.
유전도크 함몰
PHP 7.3 이전 버전에서는 세습 문자열 끝 구분 기호 앞에 공백을 붙일 수 없습니다.
print <<< HTML <link..> HTML; ⇑
해결책: 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>";
구문 강조 표시는 이러한 실수를 매우 명백하게 만듭니다.탈출을 위해 백슬래시를 사용하는 것이 중요합니다.
\"
큰따옴표 또는\'
작은 따옴표 - 문자열 인클로저로 사용된 항목에 따라 달라집니다.- 편의상 큰따옴표로 둘러싸인 플레인 HTML을 출력할 때는 작은따옴표로 묶는 것이 좋습니다.
- 변수를 보간하려면 큰따옴표로 묶은 문자열을 사용하되, 리터럴 탈출에 주의하십시오.
"
큰따옴표 - 더 긴 출력의 경우 다중 출력 선호
echo
/print
선을 긋는 대신 선을 긋습니다.더 나은 것은 유전체 절을 고려하는 것이다.
또 다른 예는 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
그러면 파서가 항의할 수 있습니다.따옴표가 없는 리터럴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
다른 문자/문자로 표시됩니다.그리고 파서는 식 연산자가 없으면 후속 2개의 리터럴/값을 이해할 수 없기 때문에 파서가 실패합니다.보이지 않는 유니코드 문자
구문 오류의 가장 끔찍한 원인은 중단되지 않는 공백과 같은 Unicode 기호입니다.PHP에서는 유니코드 문자를 식별자 이름으로 사용할 수 있습니다.전혀 의심스러운 코드에 대해 다음과 같은 T_STRING 파서 클레임이 발생한 경우:
<?php print 123;
다른 텍스트 편집기가 필요해요.아니면 16진수까지.여기서 일반 공간과 새 선처럼 보이는 것은 보이지 않는 상수를 포함할 수 있습니다.Java 기반 IDE는 UTF-8 BOM이 뒤죽박죽이 되어 있는 것, 제로 폭의 공간, 단락 구분자 등을 인식하지 못하는 경우가 있습니다.모든 것을 리디트하고 공백을 제거한 후 일반 공간을 다시 추가합니다.
용장성을 추가하여 범위를 좁힐 수 있습니다.
;
각 행 시작 시 문 구분 기호:<?php ;print 123;
엑스트라
;
여기서 세미콜론은 앞의 보이지 않는 문자를 정의되지 않은 상수 참조(문장으로 표현)로 변환합니다.그 대가로 PHP는 유용한 알림을 생성합니다.변수 이름 앞에 '$' 기호가 없습니다.
PHP의 변수는 변수 이름 뒤에 달러 기호로 표시됩니다.
달러 기호(
$
)는 ID를 변수의 이름으로 마킹하는 기호입니다.이 기호가 없으면 식별자는 언어 키워드 또는 상수일 수 있습니다.이는 PHP 코드가 다른 언어(C, Java, JavaScript 등)로 작성된 코드에서 "번역"되었을 때 흔히 볼 수 있는 오류입니다.이러한 경우 변수 유형의 선언(원래 코드가 입력된 변수를 사용하는 언어로 작성된 경우)도 몰래 빠져나와 이 오류가 발생할 수 있습니다.
이스케이프 따옴표
사용하시는 경우
\
끈에서 그것은 특별한 의미를 가지고 있다.이것은 「탈출 문자」라고 불리며, 통상은 파서에게 문자 그대로 다음 문자를 받아들이도록 지시합니다.예:
echo 'Jim said \'Hello\'';
인쇄하다Jim said 'hello'
문자열의 끝부분 따옴표를 생략하면 끝부분 따옴표는 의도한 대로가 아니라 문자 그대로 받아들여집니다. 즉, 문자열을 닫지 않고 인쇄 가능한 따옴표로 간주됩니다.이것은 일반적으로 다음 문자열을 연 후 또는 스크립트의 마지막에 해석 오류로 표시됩니다.
Windows에서 경로를 지정할 때 자주 발생하는 오류:
"C:\xampp\htdocs\"
틀렸습니다.당신은 필요하다"C:\\xampp\\htdocs\\"
.유형 속성
다음과 같은 속성 입력을 사용하려면 PHP §7.4가 필요합니다.
public stdClass $obj;
의외의(
여는 괄호는 일반적으로 다음과 같은 언어 구조를 따릅니다.if
/foreach
/for
/array
/list
산술식을 시작할 수도 있습니다.그 다음부터는 구문이 틀려요"strings"
이전 버전()
,홀로.$
및 일부 일반적인 선언 컨텍스트에서.
함수 선언 파라미터
이 에러의 경우는, 식을 디폴트 함수 파라미터로서 사용하려고 하는 경우는 거의 없습니다.이는 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(), 빈, 키, next, 현재
둘다요.
isset()
그리고.empty()
기능이 아니라 기본 언어입니다.변수에 직접 접근해야 합니다.실수로 한 쌍의 괄호를 너무 많이 추가하면 식을 만들 수 있습니다.⇓ if (isset(($_GET["id"]))) {
이는 암묵적인 변수 이름 액세스가 필요한 모든 언어 구성에도 적용됩니다.이러한 기본 제공은 언어 문법의 일부이므로 장식적인 추가 괄호는 허용하지 않습니다.
변수 참조가 필요하지만 식 결과가 전달되는 사용자 수준 함수는 대신 런타임 오류로 이어집니다.
의외의)
함수 매개 변수가 없습니다.
함수 호출에서는 스트레이 콤마를 마지막에 사용할 수 없습니다.PHP는 거기에 값을 기대하기 때문에 조기 종료에 대해 불평합니다.
)
괄호⇓ callfunc(1, 2, );
후행 콤마는 다음에만 사용할 수 있습니다.
array()
또는list()
구성.미완성 표현
산술식으로 무언가를 잊으면 파서는 포기한다.왜냐하면 어떻게 해석할 수 있을까요?
⇓ $var = 2 * (1 + );
그리고 만약 당신이 마감을 잊었다면
)
예상치 못한 세미콜론에 대한 불만을 대신 듣게 될 것이다.로서 포어치
constant
control 스테이트먼트에서 변수 프레픽스를 잊어버린 경우 다음과 같이 표시됩니다.
↓ ⇓ foreach ($array as wrong) {
여기 있는 PHP는 때때로 다음과 같이 말합니다.
::
대신.왜냐하면 클래스::$syslog는 예상된 $syslog 식을 만족시킬 수 있습니다.
의외의{
물결 괄호{
그리고.}
코드 블록을 묶습니다.구문 오류는 보통 잘못된 중첩을 나타냅니다.
에서 일치하지 않는 하위 표현식
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 { }
그건 말이 안 돼, 분명히.일반적인 용의자들도 마찬가지고
for
/foreach
,while
/do
,기타.이 에러가 발생했을 경우는, 반드시 몇개의 수동의 예를 참조해 주세요.
예기치 않은 T_한다면
예기치 않은 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) { … }
임의의 더블
}
}
브랜치만 닫는 것이 아니라 이전 조건 구조도 닫힙니다.따라서 하나의 코딩 스타일을 고수하고 중첩된 if/else 트리에서 혼합하거나 일치시키지 마십시오.여기에 일관성이 있는 것 말고도, 긴 상태를 피하는 것도 도움이 됩니다.임시 변수 또는 함수를 사용하여 읽을 수 없음
if
-제안사항IF
표현에 사용할 수 없다의외로 빈번한 신입사원 실수는 다음 중 하나를 사용하려고 하는 것입니다.
if
표현식의 문장(예: 인쇄문):⇓ echo "<a href='" . if ($link == "example.org") { echo …
그건 물론 무효입니다.
삼항 조건을 사용할 수 있지만 가독성에 영향을 주지 않도록 주의하십시오.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
그렇지 않으면 이러한 출력 구성을 분해합니다.여러 개의 및 을 사용합니다.
임시 변수를 사용하고 조건 조건을 다음 앞에 배치하는 것이 좋습니다.if ($link) { $href = "yes"; } else { $href = "no"; } echo "<a href='$href'>Link</a>";
이러한 경우에 대한 기능 또는 방법을 정의하는 것도 이치에 맞는 경우가 많습니다.
제어 블록이 "결과"를 반환하지 않음
이런 일은 흔치 않지만, 몇몇 코더들은 심지어 치료하려고도 합니다.
if
결과를 반환할 수 있는 것처럼 보입니다.$var = if ($x == $y) { "true" };
구조적으로 동일한 기능을 사용하는 경우
if
문자열 연결/식 내.코드 블록에서 할당을 사용해야 합니다.
if ($x == $y) { $var = "true"; }
또는 에 의존합니다.
?:
삼원 비교[ If in If ](이 경우)
다음 조건 내에 를 네스트할 수도 없습니다.
⇓ if ($x == true and (if $y != false)) { ... }
이건 분명히 중복된 거야 왜냐면
and
(또는or
)는 이미 체인의 비교를 가능하게 하고 있습니다.잊혀진
;
세미콜론다시 한 번: 각 제어 블록은 하나의 문이어야 합니다.이전 코드 조각이 세미콜론으로 끝나지 않은 경우, 그것은 보증된 구문 오류입니다.
⇓ $var = 1 + 2 + 3 if (true) { … }
Btw, a의 마지막 줄
{…}
코드 블록에도 세미콜론이 필요합니다.세미콜론이 너무 이르다
이 함정은 간과하기 쉽기 때문에 특정 코딩 스타일을 탓하는 것은 잘못된 것일 수 있습니다.
⇓ if ($x == 5); { $y = 7; } else ← { $x = -1; }
그건 네가 상상하는 것보다 더 자주 일어나는 일이야.
- 식을 종료하면 void 문이 실행됩니다.그
;
공허해지다{}
그 자체로! - 그
{…}
블록은 이와 같이 에서 분리된다.if
, 그리고 항상 실행됩니다. - 그래서...
else
더 이상 개방과 관계가 없다if
이 때문에 예기치 않은 T_ELSE 구문 오류가 발생합니다.
마찬가지로 이 구문 오류의 미묘한 변화도 설명됩니다.
if ($x) { x_is_true(); }; else { something_else(); };
어디서?
;
코드 블록 뒤에{…}
전체 종료if
구축, 절단else
구문적으로 분기합니다.- 식을 종료하면 void 문이 실행됩니다.그
코드 블록 사용 안 함
구문적으로는 물결 괄호를 생략할 수 있습니다.
{
…}
코드 블록의 경우if
/elseif
/else
나뭇가지.안타깝게도 이것은 번역되지 않은 코더에게 매우 일반적인 구문 스타일입니다. (잘못된 가정 하에 이것은 타이핑이나 읽기가 더 빨랐습니다.)그러나 그것은 구문을 깨트릴 가능성이 높다.조만간 if/else 브랜치에 추가 스테이트먼트가 추가될 것입니다.
if (true) $x = 5; elseif (false) $x = 6; $y = 7; ← else $z = 0;
하지만 실제로 코드 블록을 사용하려면
{
…}
그런 사람들이야!경험이 풍부한 프로그래머도 이 괄호 없는 구문을 피하거나 적어도 규칙의 예외로 이해해야 합니다.
기타 / 순서가 잘못된 경우
한 가지 명심해야 할 것은 물론 조건부 명령이다.
if ($a) { … } else { … } elseif ($b) { … } ↑
몇 개라도 가질 수 있다.
elseif
원하는 대로 할 수 있지만 마지막으로 해야 합니다.원래 그래요.클래스 선언
위에서 설명한 바와 같이 control 문을 클래스 선언에 포함할 수 없습니다.
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
나뭇가지. - 인쇄문이 어디에 속하는지 또는 양쪽 브랜치에서 반복해야 하는지 결정해야 합니다.
또한 if/else를 다른 제어 구조 간에 분할할 수 없습니다.
foreach ($array as $i) { if ($i) { … } } else { … }
에는 구문적인 관계가 없습니다.
if
그리고.else
.그foreach
어휘 범위 끝}
그래서 이 모든 것이 무의미합니다.if
계속하는 구조입니다.- 어쨌든 이건 말이 안 돼PHP가 다음 중 하나를 점프할 때 "정의되지 않은" 상태가 있었던 것은 아닙니다.
T_ENDIF
예기치 않은 T_ENDIF가 불만족스러운 경우 대체 구문 스타일을 사용합니다.
if:
⋯elseif:
⋯else:
⋯endif;
두 번 다시 생각해 보세요흔히 볼 수 있는 함정은 섬뜩할 정도로 비슷한 콜론을 세미콜론으로 혼동하는 것입니다. ("Semicolon too early"에서 설명함)
템플릿 파일에서 들여쓰기는 추적하기 어렵기 때문에 대체 구문을 사용할 때 더 많이 사용할 수 있습니다.
endif;
어느 것에도 일치하지 않는다if:
.사용률이 2배로 증가하다
if
- 터미네이터.
보통 "예상치 못한 $end"는 잊혀진 마감에 대한 대가입니다.
}
곱슬곱슬한 괄호할당과 비교
따라서 이것은 구문 오류가 아니라 다음 문맥에서 언급할 가치가 있습니다.
⇓ if ($x = true) { } else { do_false(); }
그것은
===
비교가 아니라 과제이다.이는 다소 미묘하며, 일부 사용자는 쉽게 전체 조건 블록을 편집할 수 있습니다.논리적 오류/불량 현상이 발생할 때는 먼저 의도하지 않은 할당에 주의하십시오.
예기치 않은 $end
PHP가 "예상치 못한" 것에 대해 말할 때$end
파서가 더 많은 코드를 예상하는 동안 코드가 종료되었음을 의미합니다.(이 메시지는 문자 그대로 해석하면 약간 오해의 소지가 있습니다.이것은 "$end"라는 이름의 변수에 관한 것이 아닙니다.신입자가 때때로 추측하는 경우도 있습니다.이것은 「파일의 끝」을 나타냅니다.
원인: 불균형
{
그리고.}
코드 블록 / 및 함수 또는 클래스 선언의 경우.
거의 항상 실종에 대한 얘기지만}
이전 코드 블록을 닫으려면 물결 괄호를 사용합니다.그 말은 파서가 마지막을 찾길 기대한다는 거야}
파일 끝에 도달했어요
이러한 문제를 피하기 위해 올바른 들여쓰기를 사용하십시오.
괄호 매칭 IDE를 사용하여 IDE의 위치를 확인합니다.
}
잘못됐다.대부분의 IDE 및 텍스트 편집기에는 다음과 같은 키보드 단축키가 있습니다.- NetBeans, PhpStorm, Komodo: 및
- 이클립스, 압타나:
- ATOM, Sublime: - Zend Studio
- Geany, Notepad++: - Joe: - Emacs: - Vim:
또한 대부분의 IDE에서는 일치하는 괄호, 괄호 및 괄호를 강조 표시합니다.그 때문에 상관관계를 조사하는 것이 매우 쉬워집니다.
종료되지 않은 식
안Unexpected $end
구문/파서 오류는 종료되지 않은 식 또는 문에서도 발생할 수 있습니다.
$var = func(1,
?>
EOF
먼저 스크립트의 끝을 확인합니다.후행;
대부분의 경우 PHP 스크립트의 마지막 문에 대해 중복됩니다.하지만 넌 하나 가져야 해.정확히는 그것이 그러한 구문 문제를 좁히기 때문이다.특히 스크립트의 마지막에 스테이트먼트를 추가하는 경우는 그렇습니다.
들여쓰기된 GREENDOC 마커
또 다른 일반적인 경우는, GREEDOC 또는 NOWDOC 문자열과 함께 표시됩니다.끝 마커는 선행 공백, 탭 등과 함께 무시됩니다.
print <<< END
Content...
Content....
END;
# ↑ terminator isn't exactly at the line start
따라서 파서는 파일이 끝날 때까지 GREEDOC 문자열이 계속된다고 가정합니다(따라서 "예상하지 않은 $end").거의 모든 IDE 및 구문 강조 표시 편집기가 이를 명확히 하거나 경고합니다.
이스케이프 따옴표
사용하시는 경우\
끈에서 그것은 특별한 의미를 가지고 있다.이것은 「탈출 문자」라고 불리며, 통상은 파서에게 문자 그대로 다음 문자를 받아들이도록 지시합니다.
예:echo 'Jim said \'Hello\'';
인쇄하다Jim said 'hello'
문자열의 끝부분 따옴표를 생략하면 끝부분 따옴표는 의도한 대로가 아니라 문자 그대로 받아들여집니다. 즉, 문자열을 닫지 않고 인쇄 가능한 따옴표로 간주됩니다.이것은 일반적으로 다음 문자열을 연 후 또는 스크립트의 마지막에 해석 오류로 표시됩니다.
Windows에서 경로를 지정할 때 자주 발생하는 오류:"C:\xampp\htdocs\"
틀렸습니다.당신은 필요하다"C:\\xampp\\htdocs\\"
또는 보통 PHP는 Unix 형식의 경로를 변환합니다(예:"C:/xampp/htdocs/"
)를 참조해 주세요.
대체 구문
템플릿에서 스테이트먼트/코드블록 대체 구문을 사용할 경우 이 구문 오류가 나타나는 경우는 거의 없습니다.사용.if:
그리고.else:
행방불명endif;
예를들면.
다음 항목도 참조하십시오.
- PHP 구문 오류 "예상하지 않은 $end"
- 해석 오류: 구문 오류, 내 PHP 코드의 예기치 않은 파일 끝
- 구문 분석 오류 예기치 않은 파일 끝, PHP 사용
- PHP 구문 분석 오류: 구문 오류, CodeIgniter 뷰에서 예기치 않은 파일 끝
- 해석 오류: 구문 오류, 예기치 않은 파일 끝(등록 스크립트)
- "Parse error: 구문 오류, 예기치 않은 $end" 유니 등록 할당용
- PHP 오류 수정: PHP 오류 #3: 예기치 않은 파일 끝
예기치 않은 T_IS_EQUAL
예기치 않은 T_IS_GREATER_OR_EQUAL
예기치 않은 T_IS_Idual
예기치 않은 T_IS_NOT_EQUAL
예기치 않은 T_IS_NOT_Idential
예기치 않은 T_IS_SMINGER_OR_EQUAL
의외의<
의외의>
다음과 같은 비교 연산자==
,>=
,===
,!=
,<>
,!==
그리고.<=
또는<
그리고.>
대부분 다음과 같은 표현에만 사용되어야 한다.if
표현.파서가 불평하는 경우 파싱이 잘못되었거나 일치하지 않는 경우가 많습니다.(
)
주변이 패런이 되어 있어요.
패렌스 그룹화
특히,
if
여러 비교를 사용한 문장은 여는 괄호와 닫는 괄호를 올바르게 카운트하기 위해 주의해야 합니다.⇓ if (($foo < 7) && $bar) > 5 || $baz < 9) { ... } ↑
여기에서는,
if
여기의 조건은 이미 에 의해 종료되었습니다.)
비교가 충분히 복잡해지면 여러 개의 비교와 네스트된 비교로 분할하는 것이 도움이 되는 경우가 많다.
if
오히려 구축합니다.비교에 의해 으깬isset()
흔히 볼 수 있는 신인은 Pitfal이 결합하거나 비교하려는 것입니다.
⇓ if (empty($_POST["var"] == 1)) {
또는 다음과 같은 경우도 있습니다.
⇓ if (isset($variable !== "value")) {
이것은 PHP에게 의미가 없습니다.왜냐하면
isset
그리고.empty
는 변수 이름만 사용할 수 있는 언어 구성입니다.출력은 이미 부울일 뿐이므로 결과를 비교하는 것도 의미가 없습니다.혼란스러운
>=
과 동등하게=>
배열 연산자두 연산자는 다소 비슷해 보이기 때문에 다음과 같이 혼동될 수 있습니다.
⇓ if ($var => 5) { ... }
이 비교 연산자를 "더 크거나 같음"이라고 하는 것만 기억하면 됩니다.
다음 항목도 참조하십시오.PHP의 If 문 구조
비교 대상 없음
또한 두 비교가 동일한 변수 이름과 관련된 경우에는 결합할 수 없습니다.
⇓ if ($xyz > 5 and < 100)
PHP는 초기 변수를 다시 비교하려는 의도를 추론할 수 없습니다.표현식은 보통 연산자 우선순위에 따라 쌍으로 구성되므로, 이때쯤이면
<
원래 변수에서 부울 결과만 남습니다.'예상치 않은 T_'도 참조해 주세요.IS_SMINGER_OR_EQUAL
비교 체인
연산자 행이 있는 변수와 비교할 수 없습니다.
⇓ $reult = (5 < $x < 10);
이것은 두 가지 비교로 나눌 필요가 있다. 각각은 이 비교와
$x
.이는 실제로는 (동등한 연산자 관련성으로 인해) 블랙리스트에 있는 식에 더 가깝습니다.이것은 몇 가지 C-스타일 언어에서 구문적으로 유효하지만 PHP도 예상된 비교 체인으로 해석하지 않습니다.
의외의
>
의외의<
보다 큰 것
>
이하<
오퍼레이터에는 커스텀이 없습니다.T_XXX
토큰라이저 이름다른 모든 것과 같이 잘못 배치될 수도 있지만, 인용된 문자열과 으깬 HTML에 대해 파서가 불평하는 경우가 더 많습니다.⇓ print "<a href='z">Hello</a>"; ↑
이것은 문자열에 해당합니다.
"<a href='z"
비교되고 있다>
문자 그대로의 상수까지Hello
그리고 또 하나<
비교.아니면 적어도 PHP는 그렇게 보고 있다.실제 원인 및 구문 오류는 초기 문자열입니다."
종료합니다.PHP 시작 태그를 중첩할 수도 없습니다.
<?php echo <?php my_func(); ?> ↑
다음 항목도 참조하십시오.
- php 예기치 않은 T_IS_NOT_EQUAL 오류
- 구문 오류, 예기치 않은 T_IS_EQUAL
- 반환문의 구문 오류
- http://forums.phpfreaks.com/topic/96891-parse-error-syntax-error-unexpected-t-is-not-identical-expecting-or/
예기치 않은 T_한다면
예기치 않은 T_FORACH
예기치 않은 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) {}
Such syntax errors commonly materialize for incorrectly nested
{
and}
. In particular when function code blocks got closed too early.Statements in expression context
Most language constructs can only be used as statements. They aren't meant to be placed inside other expressions:
⇓ $var = array(1, 2, foreach($else as $_), 5, 6);
Likewise can't you use an
if
in strings, math expressions or elsewhere:⇓ print "Oh, " . if (true) { "you!" } . " won't work"; // Use a ternary condition here instead, when versed enough.
For embedding
if
-like conditions in an expression specifically, you often want to use a?:
ternary evaluation.The same applies to
for
,while
,global
,echo
and a lesser extendlist
.⇓ echo 123, echo 567, "huh?";
Whereas
print()
is a language built-in that may be used in expression context. (But rarely makes sense.)Reserved keywords as identifiers
You also can't use
do
orif
and other language constructs for user-defined functions or class names. (Perhaps in PHP 7. But even then it wouldn't be advisable.)Your have a semi-colon instead of a colon (:) or curly bracket ({) after your control block
Control structures are typically wrapped in curly braces (but colons can be used in an alternative syntax) to represent their scope. If you accidentally use a semi-colon you prematurely close that block resulting in your closing statement throwing an error.
foreach ($errors as $error); <-- should be : or {
Unexpected '?'
If you are trying to use <?php
within <?php
this error will be given*.
$var = 'hello '<?php echo 'world'; ?>;
* For PHP versions 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5, 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.31, 7.4.0 - 7.4.24
If you are trying to use the null coalescing operator ??
in a version of PHP prior to PHP 7 you will get this error.
<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP
Unexpected '?', expecting variable
A similar error can occur for nullable types, as in:
function add(?int $sum): ?int {
Which again indicates an outdated PHP version being used (either the CLI version php -v
or the webserver bound one phpinfo();
).
Unexpected T_LNUMBER
The token T_LNUMBER
refers to a "long" / number.
Invalid variable names
In PHP, and most other programming languages, variables cannot start with a number. The first character must be alphabetic or an underscore.
$1 // Bad $_1 // Good
Quite often comes up for using
preg_replace
-placeholders"$1"
in PHP context:# ↓ ⇓ ↓ preg_replace("/#(\w+)/e", strtopupper($1) )
Where the callback should have been quoted. (Now the
/e
regex flag has been deprecated. But it's sometimes still misused inpreg_replace_callback
functions.)The same identifier constraint applies to object properties, btw.
↓ $json->0->value
While the tokenizer/parser does not allow a literal
$1
as variable name, one could use${1}
or${"1"}
. Which is a syntactic workaround for non-standard identifiers. (It's best to think of it as a local scope lookup. But generally: prefer plain arrays for such cases!)Amusingly, but very much not recommended, PHPs parser allows Unicode-identifiers; such that
$➊
would be valid. (Unlike a literal1
).
Stray array entry
An unexpected long can also occur for array declarations - when missing
,
commas:# ↓ ↓ $xy = array(1 2 3);
Or likewise function calls and declarations, and other constructs:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
So usually there's one of
;
or,
missing for separating lists or expressions.Misquoted HTML
And again, misquoted strings are a frequent source of stray numbers:
# ↓ ↓ echo "<td colspan="3">something bad</td>";
Such cases should be treated more or less like Unexpected T_STRING errors.
Other identifiers
Neither functions, classes, nor namespaces can be named beginning with a number either:
↓ function 123shop() {
Pretty much the same as for variable names.
Unexpected '='
This can be caused by having invalid characters in a variable name. Variables names must follow these rules:
Variable names follow the same rules as other labels in PHP. A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. As a regular expression, it would be expressed thus: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
Unexpected 'endwhile' (T_ENDWHILE)
The syntax is using a colon - if there is no colon the above error will occur.
<?php while($query->fetch()): ?>
....
<?php endwhile; ?>
The alternative to this syntax is using curly brackets:
<?php while($query->fetch()) { ?>
....
<?php } ?>
http://php.net/manual/en/control-structures.while.php
Unexpected '.'
This can occur if you are trying to use the splat operator(...
) in an unsupported version of PHP.
...
first became available in PHP 5.6 to capture a variable number of arguments to a function:
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
In PHP 7.4, you could use it for Array expressions.
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Unexpected :
1. PHP 8 named parameter syntax
unexpected ':', expecting ',' or ')'
If attempting to use PHP 8's new named parameter functionality in a version of PHP < 8 this error will occur:
$table->string(column:'Name');
Solutions:
- Upgrade your version of PHP to PHP 8.0.0 or higher
- Do not use named parameters (pass the parameters in the order they are expected)
2. Cropped class ::
separator
An error message that begins Parse error: syntax error, unexpected ':' can be caused by mistakenly writing a class static reference Class::$Variable
as Class:$Variable
.
Unexpected 'continue' (T_CONTINUE)
continue
is a statement (like for, or if) and must appear standalone. It cannot be used as part of an expression. Partly because continue doesn't return a value, but in an expression every sub-expression must result in some value so the overall expression results in a value. That's the difference between a statement and an expression.
That means continue
cannot be used in a ternary statement or any statement that requires a return value.
Unexpected 'break' (T_BREAK)
Same goes for break;
of course. It's also not usable in expression context, but a strict statement (on the same level as foreach
or an if
block).
Unexpected 'return' (T_RETURN)
Now this might be more surprising for return
, but that's also just a block-level statement. It does return a value (or NULL) to the higher scope/function, but it does not evaluate as expression itself. → That is: there's no point in doing return(return(false);;
One more reason to occurrence of these errors is unexpected whitespace like similar characters with-in code, the code lines seems to be perfect, but they contains some specific characters which are similar to break line or whitespace or tab but they not get parsed by the parser. I face this issue when I try to put some code from webpage to the code editor by simply copy paste, I saw this error with array definition. everything was looking right in array definition. I can't sort out right error, finally I define this array in single line, then error was gone. then again I try to make that definition multiple like but manually adding break(Enter) for each array element and saved the file this time no parsing error by editor and also no error while running it. For Example I faced issue with this snippet which was on one blog, actually can't post those snippets ,cause stack overflow already knows the problem with code.
then after solving it my working snippet is, which looks similar with one which shows parsing error
syntax error, unexpected ''auth'' (T_CONSTANT_ENCAPSED_STRING), expecting ']'
public $aliases = [
'csrf'=> \CodeIgniter\Filters\CSRF::class,
'toolbar'=> \CodeIgniter\Filters\DebugToolbar::class,
'honeypot'=> \CodeIgniter\Filters\Honeypot::class,
'auth' => \App\Filters\Auth::class,
];
For newbies to VS Code, if you see the syntax error, check if you have saved the file. If you have a wrong syntax, save the file, and then fix the syntax withou saving again, VS Code will keep showing you the error. The error message will disappear only after you save the file.
ReferenceURL : https://stackoverflow.com/questions/18050071/php-parse-syntax-errors-and-how-to-solve-them
'itsource' 카테고리의 다른 글
MySQL에서 선택한 문자열에 열 데이터와 함께 바꾸기를 사용하면 다른 행에 대해 동일한 출력이 생성됩니다. (0) | 2022.11.04 |
---|---|
Form Data 검사 방법 (0) | 2022.11.04 |
이 간단한 PDO 준비 문구가 작동하지 않는 이유는 무엇입니까? (0) | 2022.11.04 |
foreach 루프의 값을 배열에 저장하려면 어떻게 해야 합니까? (0) | 2022.11.04 |
관찰 가능한 rxJava2와 플로우 가능한 rxJava2 (0) | 2022.11.04 |