프로그램을 작성할 때 아무리 주의를 기울여도 실수는 불가피합니다. 이러한 오류는 일반적으로 PHP 컴파일러를 혼란스럽게 합니다. 컴파일러 오류 메시지는 쓸모가 없을 뿐만 아니라 개발자가 그 의미를 이해하지 못하면 종종 실망스럽습니다.
PHP 스크립트를 컴파일할 때 PHP 컴파일러는 처음으로 직면하는 문제를 보고하기 위해 최선을 다합니다. 이로 인해 문제가 발생합니다. PHP는 오류가 발생한 경우에만 오류를 인식할 수 있습니다(이 문제는 이 문서의 뒷부분에서 자세히 설명합니다). 이러한 이유로 컴파일러는 오류가 있는 줄이 표면적으로 구문적으로 올바른 것처럼 보일 수도 있고 전혀 존재하지 않는 줄일 수도 있다고 지적합니다!
오류 메시지를 더 잘 이해하면 무엇이 잘못되었는지 식별하고 수정하는 데 소요되는 시간을 크게 줄일 수 있습니다. 따라서 이 기사에서는 다양한 유형의 PHP 오류 메시지를 명확히 설명하고 개발 과정에서 다양한 오류 메시지의 의미를 올바르게 이해하는 방법을 설명하겠습니다.
이 문서에 설명된 내용은 사용 중인 PHP 버전과 아무런 관련이 없습니다. 왜냐하면 이 문서에 설명된 다양한 오류는 특정 버전의 특정 오류에 국한되지 않기 때문입니다. 또한, 우리는 귀하가 중급 프로그래머이고 반년 또는 1년 동안 프로그래밍에 종사했다고 가정합니다.
컴파일러 작동 방식
컴파일러가 특정 행에서 오류를 보고하는 이유를 이해하려면 먼저 컴파일러가 PHP 코드를 구문 분석하는 메커니즘을 이해해야 합니다. 이번 글에서는 이에 대해 자세히 다루지는 않겠지만, 오류로 이어질 가능성이 높은 몇 가지 간단한 개념에 대해 논의해 보겠습니다.
변수 선언
문에서 변수를 선언하는 경우 구체적인 방법은 다음과 같습니다.
$variable = 'value'
컴파일러는 먼저 문 오른쪽 절반의 값(즉, 등호 오른쪽에 있는 모든 값)을 찾습니다. 징후). 일부 프로그래밍 책에서는 이는 명령문의 RHS(오른쪽 절반)로 표시됩니다. 종종 오류를 일으키는 것은 진술의 이 부분입니다. 잘못된 구문을 사용하면 구문 분석 오류가 발생합니다.
구문 분석
오류: 구문 분석 오류, 예상치 못한 T_WHILE in c:\program files\apache group\apache\htdocs\script.php on line 19
이전 오류가 확인될 때마다 구문 분석 오류가 하나씩 계속 나타납니다. PHP는 첫 번째 구문 분석 오류 이후 스크립트 실행을 중지하므로 이러한 일련의 오류를 디버깅하고 수정하는 것은 종종 특히 지루할 수 있습니다.
또한 구문 분석 오류에는 정보가 거의 없으며 오류가 발생한 줄 번호도 거의 보고되지 않습니다. 구체적인 이유는 오류가 발생하면 컴파일러가 잘못된 구문을 발견할 때까지 여러 줄의 구문이 유효해 보이도록 결정하기 때문입니다. 예를 들어
while = 10 ; / Bad ? while은 미리 정의된 단어이며 값에 할당될 수 없습니다.
미리 정의된 단어에는 while, 함수 등이 포함됩니다. PHP가 코드를 평가하기 위해 사용하는 경우에는 변수 이름을 지정하는 데 사용할 수 없습니다. 이렇게 하면 PHP는 사용자가 참을 수 없는 더 많은 오류를 보고하게 됩니다.
이 문제와 관련하여 다음 예가 도움이 될 수 있습니다. 아래에 표시된 PHP 코드를 참조하고 읽으십시오.
<?php
$b = 어떤 값
if($b == 어떤 값){
인쇄 Hello World!;
}
?>
오류는 $b = 행(문 끝에 세미콜론 누락)에 있으므로 오류는 구문 분석 오류여야 합니다. 3행에 세미콜론이 누락되었습니다. 구문 분석기를 기반으로 결정하면 안 됩니다.
구문 분석 오류: 구문 분석 오류, 예기치 않은 T_IF in c:\program files\apache
4행의 group\apache\htdocs\ereg2.php
4행에서는 if() 문의 구문이 정확합니다. 그렇다면 컴파일러를 혼란스럽게 만드는 것은 무엇입니까? 단서는 예상치 못한 T_IF 부분이다. 예상치 못한 T_??? 오류가 발생하면 컴파일러가 미리 정의된 단어가 나타나서는 안되는 위치에 나타나는 것을 발견했습니다. T_IF는 if()를 나타내고, T_WHILE은 while()을 나타내고, T_FOR은 for()를 나타냅니다.
다행스럽게도 일부 오류의 원인도 간단합니다.
위의 예와 같이 명령문이 세미콜론(;)으로 끝나지 않기 때문입니다. 문자열에 따옴표가 없습니다.
기타 일반적인 실수
내가 보는 가장 일반적인 실수는 중괄호( } )를 사용하여 함수나 루프를 닫지 않는 경우입니다. 이는 아마도 가장 일반적이고 짜증나는 실수일 것입니다.
구체적인 코드는 다음과 같습니다.
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
다음 오류가 생성됩니다:
구문 분석 오류: 구문 분석 오류, 예기치 않은 $ in c:\program files\apache
group\apache\htdocs\ereg2.php on line 9
UselessFunction 함수는 중괄호(})로 끝나지 않기 때문에 PHP 컴파일러는 파일 끝에 도달할 때까지 닫는 중괄호를 계속 찾습니다. 컴파일러는 일치하는 중괄호를 찾지 못하기 때문에 파일 끝 오류를 보고합니다.
코드 계층 구조가 올바르게 반영되면 오류 메시지가 매우 분명해집니다. 코드의 계층적 구조를 표시하지 않으면 결국 무엇이 잊혀졌는지 알아내는 것이 거의 불가능할 것이다. 따라서 코드의 계층 구조를 나타내야 한다는 점을 기억하세요. Tab 키를 사용하면 이 작업이 쉬워집니다. 또한 후속 개발자가 코드 프레임워크를 파악하고 수정하는 것이 더 쉬울 것입니다.
MySQL 오류
매우 짜증나는 또 다른 오류 메시지는 가장 일반적인 MySQL 오류로, 이는 새로운 PHP 사용자에게 종종 골치 아픈 원인이 됩니다. 경고: 제공된 인수는 유효한 MySQL 결과 리소스가 아닙니다.
위에 보고된 오류가 있는 줄은
다음과
같습니다.($row = mysql_fetch_array($result)) {
$result 매개변수는 유효한 리소스가 아닙니다. 영어로 말하면 쿼리가 실패해서 mysql_fetch_array를 처리할 수 없다는 의미입니다. 쿼리 구문이 유효하지 않거나(테스트하려면 쿼리를 복사하여 MySQL 콘솔 참조에 붙여넣어야 함), 데이터베이스 연결에 실패했습니다(이 경우 사용자 이름, 비밀번호 등을 다시 확인해야 함).
오류 방지
첫 번째 단계로 스마트 코더는 다음 단계를 수행하여 다음 오류를 제거할 수 있습니다.
· 모든 명령문 끝에 세미콜론을 추가하는 것에 대해 생각하지 마십시오. 이는 습관이 되어야 합니다.
· 가능할 때마다 항상 코드의 계층 구조를 표시하면 호출이나 함수 끝에 중괄호를 추가하는 것을 잊었는지 확인할 수 있습니다.
· 구문 강조 기능이 있는 편집기(예: HTML-Kit)를 사용하십시오. 이러한 편집기의 도움으로 인용문 추가를 잊었는지, 세미콜론이 누락되었는지 등을 확인할 수 있습니다.
결론
이 기사에서 우리는 PHP 컴파일러가 보고할 수 있는 무의미해 보이는 오류에 대해 어느 정도 이해했습니다. 우리는 배운 내용을 실수를 피하는 방법과 실수가 발생했을 때 바로잡는 방법에 적용해야 합니다. 디버깅은 개발자 작업에서 가장 중요한 부분 중 하나입니다. 디버깅 효율성을 높이면 전체 작업 진행 속도가 크게 빨라지고, 프로젝트 완료에 걸리는 시간도 단축될 수 있으며, 코드 오류로 인한 정신적 부담도 크게 줄일 수 있습니다.