복붙노트

참고 -이 오류는 PHP에서 무엇을 의미합니까?

PHP

참고 -이 오류는 PHP에서 무엇을 의미합니까?

PHP를 프로그래밍 할 때 발생할 수있는 경고, 오류 및주의 사항에 대한 답변으로 해결 방법을 찾을 수 없습니다. 이것은 커뮤니티 위키이기 때문에 모든 사람들이이 목록에 추가 및 유지 관리에 참여하도록 초대받습니다.

Stack Overflow에서 "Headers already sent"또는 "non-object 멤버 호출"과 같은 질문이 자주 발생합니다. 그 질문의 근본 원인은 항상 동일합니다. 그래서 그 질문들에 대한 답은 전형적으로 그것들을 반복하고 그 / 그녀의 특별한 경우에 어떤 행을 바꿀지 OP를 보여줍니다. 이 답변은 OP의 특정 코드에만 적용되기 때문에 사이트에 어떤 가치도 추가하지 않습니다. 동일한 오류가있는 다른 사용자는 너무 현지화되어 솔루션을 쉽게 읽을 수 없습니다. 일단 근본 원인을 이해하면 오류를 수정하는 것이 쉽지 않기 때문에 슬픈 일입니다. 따라서이 목록은 일반적인 방법으로 솔루션을 설명하려고 시도합니다.

귀하의 질문에이 사본으로 표시된 경우 아래 오류 메시지를 찾아 코드에 적용하십시오. 답변에는 일반적으로 일반적인 답변만으로는 명확하지 않아야 할 경우 조사 할 수있는 추가 링크가 포함되어 있습니다.

공헌하고 싶다면 "즐겨 찾기"오류 메시지, 경고 또는주의 사항, 답변 당 하나씩, 간단한 설명 (심지어 설명서 페이지의 용어 만 강조 표시한다고 할지라도), 가능한 해결책 또는 디버깅 방법 및 가치있는 기존 Q & A의 목록 또한 기존 답변을 자유롭게 개선하십시오.

참조

해결법

  1. ==============================

    1.

    스크립트가 HTTP 헤더를 클라이언트에 보내려고 시도했지만 이미 이미 출력 되었기 때문에 헤더가 이미 클라이언트로 전송되었습니다.

    이것은 E_WARNING이며 스크립트를 중지하지 않습니다.

    일반적인 예는 다음과 같은 템플릿 파일입니다.

    <html>
        <?php session_start(); ?>
        <head><title>My Page</title>
    </html>
    ...
    

    session_start () 함수는 세션 쿠키가있는 헤더를 클라이언트에 보내려고 시도합니다. 그러나 PHP는 요소를 출력 스트림에 쓸 때 헤더를 이미 보냈습니다. session_start ()를 맨 위로 이동해야합니다.

    경고를 트리거하는 코드 앞에있는 행을 살펴보고 출력 위치를 확인하여이를 해결할 수 있습니다. 해당 코드 앞에있는 모든 헤더 전송 코드를 이동하십시오.

    자주 간과되는 출력은 PHP가 닫힌 후에 새로운 라인이 생기는 것입니까?>. 그것은 파일에서 마지막 것일 때?>를 생략하는 표준 연습으로 간주됩니다. 마찬가지로,이 경고의 또 다른 일반적인 원인은 PHP 파일의 구문 분석이 시작될 때 웹 서버가 헤더와 공백 / 개행 문자를 보내도록하기 위해 여는

    파일에 둘 이상의 코드 블럭이 있다면, 그 사이에 공백이 없어야합니다. (참고 : 자동으로 생성 된 코드가있는 경우 여러 개의 블록이있을 수 있습니다)

    또한 코드의 바이트 순서 표시가 없는지 확인하십시오 (예 : 스크립트의 인코딩이 BOM의 UTF-8 인 경우).

    관련 질문 :

  2. ==============================

    2.

    xyz-> method ()와 비슷한 코드로 발생합니다. 여기서 xyz는 객체가 아니므로 해당 메서드를 호출 할 수 없습니다.

    이것은 스크립트를 멈추게 할 치명적인 오류입니다 (forward compatibility notice : PHP 7부터는 잡을 수있는 오류가 될 것입니다).

    대부분이 코드는 오류 조건 검사가 누락 된 것입니다. 메소드를 호출하기 전에 객체가 실제로 객체인지 확인합니다.

    전형적인 예가

    // ... some code using PDO
    $statement = $pdo->prepare('invalid query', ...);
    $statement->execute(...);
    

    위의 예에서 쿼리는 준비 될 수 없으며 prepare ()는 $ statement에 false를 할당합니다. 값이 boolean이기 때문에 false가 "non-object"이기 때문에 execute () 메서드를 호출하려고하면 Fatal Error가 발생합니다.

    함수가 객체 대신 부울을 반환 한 이유를 찾아냅니다. 예를 들어, 발생한 마지막 오류에 대한 $ pdo 객체를 확인하십시오. 이것을 디버깅하는 방법에 대한 세부 사항은 문제의 특정 함수 / 객체 / 클래스에 대한 오류 처리 방법에 따라 달라집니다.

    만약 -> prepare가 실패한다면 $ pdo 데이터베이스 핸들 객체는 현재 스코프로 전달되지 않습니다. 정의 된 위치를 찾으십시오. 그런 다음 매개 변수로 전달하거나 속성으로 저장하거나 전역 범위를 통해 공유합니다.

    또 다른 문제는 조건부로 객체를 생성 한 다음 해당 조건 블록 외부에서 메소드를 호출하려고하는 것입니다. 예를 들어

    if ($someCondition) {
        $myObj = new MyObj();
    }
    // ...
    $myObj->someMethod();
    

    조건 블록 외부에서 메서드를 실행하면 개체가 정의되지 않을 수 있습니다.

    관련 질문 :

  3. ==============================

    3.

    죽음의 흰색 페이지 또는 죽음의 흰색 스크린이라고도합니다. 이것은 오류보고가 해제되고 치명적인 오류 (종종 구문 오류)가 발생할 때 발생합니다.

    오류 로깅이 사용 가능한 경우, 오류 로그에 구체적인 오류 메시지가 있습니다. 이것은 일반적으로 "php_errors.log"라는 파일에 있으며 중앙 위치 (예 : 많은 Linux 환경의 경우 / var / log / apache2) 또는 스크립트 자체의 디렉토리 (공유 호스팅 환경에서 사용되는 경우가 있음)에 있습니다.

    경우에 따라 일시적으로 오류 표시를 사용하는 것이 더 간단 할 수 있습니다. 그러면 흰색 페이지에 오류 메시지가 표시됩니다. 이러한 오류는 웹 사이트를 방문하는 모든 사람들에게 보이기 때문에주의하십시오.

    이것은 스크립트 상단에 다음 PHP 코드를 추가하여 쉽게 수행 할 수 있습니다.

    ini_set('display_errors', 1); error_reporting(~0);
    

    이 코드는 오류 표시를 켜고보고를 가장 높은 수준으로 설정합니다.

    ini_set ()은 런타임에 실행되기 때문에 구문 분석 / 구문 오류에는 영향을 미치지 않습니다. 이러한 오류는 로그에 나타납니다. 출력에 표시하려는 경우 (예 : 브라우저에서) display_startup_errors 지시문을 true로 설정해야합니다. php.ini 나 .htaccess 또는 런타임 이전에 설정에 영향을주는 다른 방법으로이 작업을 수행하십시오.

    같은 방법을 사용하여 log_errors 및 error_log 지정 문을 설정하여 고유 한 로그 파일 위치를 선택할 수 있습니다.

    로그를 보거나 디스플레이를 사용하면 훨씬 나은 오류 메시지와 스크립트가 중단되는 코드 행을 얻을 수 있습니다.

    관련 질문 :

    관련 오류 :

  4. ==============================

    4.

    배열에 존재하지 않는 키를 사용하여 배열에 액세스하려고하면 발생합니다.

    정의되지 않은 색인 공지의 일반적인 예는 (데모)

    $data = array('foo' => '42', 'bar');
    echo $data['spinach'];
    echo $data[1];
    

    시금치와 1은 배열에 존재하지 않으므로 E_NOTICE가 트리거됩니다.

    해결책은 해당 인덱스에 액세스하기 전에 인덱스 또는 오프셋이 있는지 확인하는 것입니다. 이것은 프로그램에 버그를 수정해야만 인덱스가 예상대로 존재하는지 확인할 수 있습니다. 또는 array_key_exists 또는 isset을 사용하여 인덱스가 존재하는지 여부를 테스트해야 할 수도 있습니다.

    $data = array('foo' => '42', 'bar');
    if (array_key_exists('spinach', $data)) {
        echo $data['spinach'];
    }
    else {
        echo 'No key spinach in array';
    }
    

    다음과 같은 코드가있는 경우 :

    <?php echo $_POST['message']; ?>
    <form method="post" action="">
        <input type="text" name="message">
        ...
    

    이 페이지가 처음로드 될 때 $ _POST [ 'message']가 설정되지 않고 위의 오류가 발생합니다. 양식이 제출되고이 코드가 실행될 때만 두 번째 배열 색인이 존재하게됩니다. 일반적으로 다음 사항을 확인하십시오.

    if ($_POST)  ..  // if the $_POST array is not empty
    // or
    if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST
    

    관련 질문 :

  5. ==============================

    5.

    맨 먼저:

    이것은 mysql_query의 결과에서 데이터를 가져 오려고 시도하지만 쿼리가 실패 할 때 발생합니다.

    이것은 경고이며 스크립트를 중지하지 않지만 프로그램을 잘못 만들 것입니다.

    mysql_query가 리턴 한 결과를 다음과 같이 점검해야한다.

    $res = mysql_query($sql);
    if (!$res) {
       die(mysql_error());
    }
    // after checking, do the fetch
    

    관련 질문 :

    관련 오류 :

    mysql 결과 리소스를 매개 변수로 기대하는 다른 mysql * 함수도 동일한 이유로 동일한 오류를 생성합니다.

  6. ==============================

    6.

    $ 이것은 PHP에서 할당 할 수없는 특별한 변수입니다. 존재하지 않는 컨텍스트에서 액세스되는 경우이 치명적인 오류가 발생합니다.

    이 오류가 발생할 수 있습니다.

    관련 질문 :

  7. ==============================

    7.

    아직 정의되지 않은 함수를 호출하려고하면 발생합니다. 일반적인 원인으로는 누락 된 확장 및 포함, 조건부 함수 선언, 함수 선언의 함수 또는 간단한 오타가 있습니다.

    예제 1 - 조건부 함수 선언

    $someCondition = false;
    if ($someCondition === true) {
        function fn() {
            return 1;
        }
    }
    echo fn(); // triggers error
    

    이 경우 $ someCondition이 참이 아니기 때문에 fn ()이 선언되지 않습니다.

    예제 2 - 함수 선언의 함수

    function createFn() 
    {
        function fn() {
            return 1;
        }
    }
    echo fn(); // triggers error
    

    이 경우 fn은 createFn ()이 호출 된 후에 만 ​​선언됩니다. 이후 createFn ()을 호출하면 Existing 함수의 재 선언에 대한 오류가 트리거됩니다.

    PHP 내장 함수에 대해서도이를 볼 수 있습니다. 공식 매뉴얼에서 함수를 검색해보고, 그것이 속한 "확장 기능"(PHP 모듈)과 PHP가 지원하는 버전을 확인하십시오.

    누락 된 확장 기능이있는 경우 해당 확장 기능을 설치하고 php.ini에서 사용 가능하게하십시오. 함수가 표시되는 확장 기능에 대해서는 PHP 매뉴얼의 설치 지침을 참조하십시오. 패키지 관리자 (예 : Debian 또는 Ubuntu에서는 apt, Red Hat 또는 CentOS에서는 aum)를 사용하여 확장을 활성화하거나 설치할 수 있습니다 공유 호스팅 환경의 제어판

    이 함수가 사용중인 PHP의 최신 버전에 도입 된 경우, 매뉴얼 또는 주석 섹션에서 다른 구현에 대한 링크를 찾을 수 있습니다. PHP에서 제거 된 경우 더 이상 필요하지 않을 수 있으므로 이유에 대한 정보를 찾습니다.

    Include가 누락 된 경우 함수를 호출하기 전에 함수를 선언 한 파일을 포함시켜야합니다.

    오타가있는 경우 오타를 수정하십시오.

    관련 질문 :

  8. ==============================

    8.

    예기치 않은 장소에 T_XXX 토큰이있을 때, 불균형 (불필요한) 괄호, php.ini에서 활성화하지 않고 짧은 태그를 사용하는 경우 등이 이에 해당됩니다.

    관련 질문 :

    추가 도움말은 다음을 참조하십시오.

  9. ==============================

    9.

    이것은 보통 비어있는 함수를 사용할 때 발생합니다.

    예:

    if (empty(is_null(null))) {
      echo 'empty';
    }
    

    비어있는 부분은 함수가 아닌 언어 구조이기 때문에 5.5 이전의 PHP 버전에서는 표현식을 인수로 호출 할 수 없습니다. PHP 5.5 이전에는 empty ()에 대한 인수가 변수 여야하지만 PHP 5.5 이상에서는 임의의 표현식 (함수의 반환 값 등)이 허용됩니다.

    변수의 이름에도 불구하고 빈 변수는 실제로 변수가 "비어 있는지"확인하지 않습니다. 대신 변수가 존재하지 않는지 검사하거나 == false. 표현식 (예 : is_null (null))은 항상 존재하는 것으로 간주되므로 비어있는 경우에만 false와 같으면 검사합니다. 여기에서 empty ()를!로 바꿀 수 있습니다. if (! is_null (null)), 또는 명시 적으로 false와 비교합니다. if (is_null (null) == false).

    관련 질문 :

  10. ==============================

    10.

    이 오류는 종종 MySQL 쿼리에 전달 된 데이터를 올바르게 이스케이프 처리하지 않아서 발생합니다.

    하지 말아야 할 일 ( "나쁜 생각")의 예 :

    $query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
    mysqli_query($db, $query);
    

    이 코드는 http://example.com/edit.php?id=10과 같은 URL과 함께 제출할 양식이있는 페이지에 포함될 수 있습니다 (게시물 번호 10 수정).

    제출 된 텍스트에 작은 따옴표가 있으면 어떻게됩니까? $ 쿼리는 다음과 같이 끝납니다 :

    $query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';
    

    그리고이 쿼리가 MySQL로 보내지면 중간에 여분의 작은 따옴표가 있기 때문에 문법이 잘못되었다고 불평 할 것입니다.

    이러한 오류를 방지하려면 쿼리에서 사용하기 전에 반드시 데이터를 이스케이프 처리해야합니다.

    SQL 쿼리에서 사용하기 전에 데이터를 이스케이프 처리하는 것은 매우 중요합니다. 그렇게하지 않으면 스크립트가 SQL 인젝션에 개방 될 것이기 때문입니다. SQL 삽입은 레코드, 테이블 또는 전체 데이터베이스의 변경, 손실 또는 수정을 유발할 수 있습니다. 이것은 매우 심각한 보안 문제입니다!

    선적 서류 비치:

  11. ==============================

    11.

    스크립트를 실행할 충분한 메모리가 없습니다. PHP가 메모리 제한에 도달하여 실행을 중지합니다. 이 오류는 치명적이며 스크립트는 중지됩니다. 메모리 제한 값은 php.ini 파일이나 ini_set ( 'memory_limit', '128 M')을 사용하여 구성 할 수 있습니다. (php.ini에 정의 된 값을 덮어 씁니다). 메모리 제한의 목적은 단일 PHP 스크립트가 사용 가능한 모든 메모리를 집어 들고 전체 웹 서버를 다운시키는 것을 방지하는 것입니다.

    가장 먼저해야 할 일은 스크립트에 필요한 메모리 양을 최소화하는 것입니다. 예를 들어, 큰 파일을 변수로 읽거나 데이터베이스에서 많은 레코드를 가져 와서 배열에 모두 저장하는 경우 많은 메모리를 사용할 수 있습니다. 코드를 변경하여 파일을 한 줄씩 읽거나 메모리에 모두 저장하지 않고 한 번에 하나씩 데이터베이스 레코드를 가져 오십시오. 이것은 장면 뒤에서 일어나는 일과 데이터가 다른 곳과 다른 곳에서 메모리에 저장 될 때 약간의 개념적 인식을 필요로합니다.

    스크립트가 메모리 집약적 인 작업을 수행하지 않을 때이 오류가 발생하면 코드를 검사하여 메모리 누수가 있는지 확인해야합니다. memory_get_usage 함수는 친구입니다.

    관련 질문 :

  12. ==============================

    12.

    이 오류는 복잡한 변수 전체 구조가 {}로 묶이지 않은 경우 큰 따옴표로 묶인 문자열에서 보간을 위해 인용 된 키를 사용하여 배열 값을 참조하려고 할 때 자주 발생합니다.

    예기치 않은 T_ENCAPSED_AND_WHITESPACE가 발생합니다.

    echo "This is a double-quoted string with a quoted array key in $array['key']";
    //---------------------------------------------------------------------^^^^^
    

    큰 따옴표로 묶인 문자열에서 PHP는 배열 키 문자열을 인용 부호없이 사용하도록 허용하고 E_NOTICE를 발행하지 않습니다. 따라서 위의 내용은 다음과 같이 작성 될 수 있습니다.

    echo "This is a double-quoted string with an un-quoted array key in $array[key]";
    //------------------------------------------------------------------------^^^^^
    

    전체 배열 변수와 키는 {}로 묶을 수 있습니다.이 경우 E_NOTICE를 피하기 위해 따옴표로 묶어야합니다. PHP 문서는 복잡한 변수에 대해이 구문을 권장합니다.

    echo "This is a double-quoted string with a quoted array key in {$array['key']}";
    //--------------------------------------------------------------^^^^^^^^^^^^^^^
    // Or a complex array property of an object:
    echo "This is a a double-quoted string with a complex {$object->property->array['key']}";
    

    물론, 위의 대안 중 하나는 배열 변수를 삽입하는 대신 연결하는 것입니다.

    echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside.";
    //----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^
    

    참고로 PHP Strings 매뉴얼 페이지의 변수 파싱 섹션을 참고하십시오.

  13. ==============================

    13.

    범위 분석 연산자는 히브리어 "Paamayim Nekudotayim"이라고도합니다. "double colon"또는 "double dot double"을 의미합니다.

    이 오류는 실수로 코드에 ::를 넣으면 발생합니다.

    관련 질문 :

    선적 서류 비치:

  14. ==============================

    14.

    즉, 동일한 함수 / 클래스 이름을 두 번 사용하고 있고 그 중 하나의 이름을 변경해야하거나 require_once 또는 include_once를 사용해야하는 곳에서 require 또는 include를 사용했기 때문입니다.

    PHP에서 클래스 나 함수가 선언 될 때 불변이므로 나중에 새 값으로 선언 할 수 없습니다.

    다음 코드를 살펴보십시오.

    class.php

    <?php
    
    class MyClass
    {
        public function doSomething()
        {
            // do stuff here
        }
    }
    

    index.php

    <?php
    
    function do_stuff()
    {
       require 'class.php';
       $obj = new MyClass;
       $obj->doSomething();
    }
    
    do_stuff();
    do_stuff();
    

    do_stuff ()에 대한 두 번째 호출은 위의 오류를 생성합니다. require를 require_once로 변경하면 MyClass 정의가 포함 된 파일이 한 번만로드되고 오류는 피할 수 있습니다.

  15. ==============================

    15.

    보통 include, require 또는 fopen을 사용하여 파일을 호출하면 PHP가 파일을 찾지 못하거나 파일을로드 할 수있는 권한이 없습니다.

    이것은 여러 가지 이유로 발생할 수 있습니다.

    일반적인 실수 중 하나는 절대 경로를 사용하지 않는 것입니다. __DIR__ 또는 dirname (__ FILE__)과 같은 전체 경로 또는 마법 상수를 사용하면 쉽게 해결할 수 있습니다.

    include __DIR__ . '/inc/globals.inc.php';
    

    또는:

    require dirname(__FILE__) . '/inc/globals.inc.php';
    

    올바른 경로가 사용되는지 확인하는 것은 이러한 문제를 해결하는 한 단계이며, 존재하지 않는 파일, PHP 자체의 액세스를 막는 파일 시스템 권한 또는 개방형 기반의 제한 사항과 관련 될 수 있습니다.

    이 문제를 신속하게 해결하는 가장 좋은 방법은 아래의 문제 해결 체크리스트를 따르는 것입니다.

    관련 질문 :

    관련 오류 :

  16. ==============================

    16.

    이전에 정의되지 않은 변수를 사용하려고하면 발생합니다.

    전형적인 예가

    foreach ($items as $item) {
        // do something with item
        $counter++;
    }
    

    전에 $ counter를 정의하지 않았다면, 위의 코드는 알림을 시작합니다.

    올바른 방법은 변수를 사용하기 전에 변수를 설정하는 것입니다.

    $counter = 0;
    foreach ($items as $item) {
        // do something with item
        $counter++;
    }
    

    관련 질문 :

  17. ==============================

    17.

    또는 PHP 7.2 이상에서

    이 알림은 토큰이 코드에서 사용되고 상수 인 것처럼 보이지만 해당 이름의 상수는 정의되지 않은 경우에 발생합니다.

    이 공지의 가장 일반적인 원인 중 하나는 연관 배열 키로 사용 된 문자열을 인용하지 않는 것입니다.

    예 :

    // Wrong
    echo $array[key];
    
    // Right
    echo $array['key'];
    

    또 다른 일반적인 원인은 변수 이름 앞에 $ (달러) 기호가 누락되었습니다.

    // Wrong
    echo varName;
    
    // Right
    echo $varName;
    

    아니면 다른 상수 또는 키워드의 철자가 잘못되었을 수도 있습니다.

    // Wrong
    $foo = fasle;
    
    // Right
    $foo = false;
    

    또한 라이브러리에서 정의한 상수에 액세스하려고 할 때 필요한 PHP 확장 또는 라이브러리가 없다는 표시 일 수도 있습니다.

    관련 질문 :

  18. ==============================

    18.

    이 경고는 파일 및 디렉토리 액세스와 관련된 다양한 기능과 함께 나타날 수 있습니다. 구성 문제에 대해 경고합니다.

    표시되면 일부 파일에 대한 액세스가 금지되었음을 의미합니다.

    경고 자체는 아무 것도 깨지 않지만 파일 액세스가 차단되면 스크립트가 제대로 작동하지 않는 경우가 가장 흔합니다.

    일반적으로 PHP 구성을 수정하는 수정 사항이며 관련 설정은 open_basedir입니다.

    때로는 잘못된 파일이나 디렉토리 이름이 사용되는 경우 올바른 파일을 사용하게됩니다.

    관련 질문 :

  19. ==============================

    19.

    이름에서 알 수 있듯이 이러한 유형의 오류는 반복 할 때 가장 많이 발생하거나 존재하지 않는 키가있는 배열에서 값을 찾을 때 발생합니다.

    $ string의 모든 문자를 표시하려고합니다.

    $string = 'ABCD'; 
    for ($i=0, $len = strlen($string); $i <= $len; $i++){
        echo "$string[$i] \n"; 
    }
    

    위의 예는 다음을 생성합니다 (온라인 데모).

    A
    B
    C
    D
    Notice: Uninitialized string offset: 4 in XXX on line X
    

    그리고 스크립트가 D를 반향하는 순간, for () 루프 안에서 PHP가 'ABCD'의 첫 번째부터 다섯 번째까지의 문자열을 표시하도록했기 때문에 에러가 발생합니다. 루프가 0부터 카운트하기 시작하고 D가 4에 도달 할 때까지 에코하면 오프셋 에러가 발생합니다.

    유사한 오류 :

  20. ==============================

    20.

    가능한 시나리오

    내 코드가 잘못 된 부분을 찾을 수없는 것 같습니다. 여기에 내 모든 오류가 있습니다 :

    내가 뭘하려고하는지

    $sql = 'SELECT * FROM dealer WHERE id="'$id.'"';
    

    대답

    구문 분석 오류 : 프로그램 구문에 문제가 있습니다. 예를 들어 문 끝에 세미콜론을 사용하지 않거나 위의 경우와 마찬가지로. 운영자. 인터프리터는 구문 분석 오류가 발생하면 프로그램 실행을 중지합니다.

    간단히 말해서 이것은 구문 오류입니다. 즉, 코드에서 올바르게 구문 분석되지 않고 실행되는 것을 막는 무언가가 있음을 의미합니다.

    당신이해야 할 일은 간단한 실수에 대한 오류 주변의 라인을주의 깊게 점검하는 것입니다.

    이 오류 메시지는 파일의 x 줄에서 PHP 인터프리터가 열린 괄호를 볼 것으로 예상했지만 대신 T_VARIABLE이라는 것을 발견했습니다. 그 T_VARIABLE 것을 토큰이라고합니다. 이것은 PHP 인터프리터가 프로그램의 다양한 기본 부분을 표현하는 방식입니다. 통역사가 프로그램을 읽으면 작성한 내용을 토큰 목록으로 변환합니다. 프로그램에 변수를 넣을 때마다 인터프리터 목록에 aT_VARIABLE 토큰이 있습니다.

    좋은 읽을 거리 : 파서 ​​토큰 목록

    따라서 php.ini에서 최소한 E_PARSE를 활성화하십시오. 프로덕션 스크립트에는 구문 분석 오류가 없어야합니다.

    코딩하는 동안 항상 다음 문장을 추가하는 것이 좋습니다.

    error_reporting(E_ALL);
    

    PHP 오류보고

    또한 입력하는 동안 구문 분석 오류를 알려주는 IDE를 사용하는 것이 좋습니다. 당신이 사용할 수있는:

    관련 질문 :

  21. ==============================

    21.

    이 오류는 두 가지 변형이 있습니다.

    $arr = [1, 2, 3];
    

    이 배열 이니셜 라이저 구문은 PHP 5.4에서만 도입되었습니다. 그 전에 버전에서 파서 오류가 발생합니다. 가능하면 설치를 업그레이드하거나 이전 구문을 사용하십시오.

    $arr = array(1, 2, 3);
    

    설명서의이 예제를 참조하십시오.

    $suffix = explode(',', 'foo,bar')[1];
    

    배열 역 참조 함수 결과는 PHP 5.4에서도 소개되었습니다. 업그레이드가 불가능한 경우 (임시) 변수를 사용해야합니다.

    $parts = explode(',', 'foo,bar');
    $suffix = $parts[1];
    

    설명서의이 예제를 참조하십시오.

  22. ==============================

    22.

    객체가없는 상태에서 객체의 속성에 액세스하려고하면 발생합니다.

    비 객체 통지에 대한 일반적인 예는 다음과 같습니다.

    $users = json_decode('[{"name": "hakre"}]');
    echo $users->name; # Notice: Trying to get property of non-object
    

    이 경우 $ users는 배열이므로 객체가 아니며 속성이 없습니다.

    이는 존재하지 않는 색인이나 배열의 키에 액세스하는 것과 유사합니다 (주의 : 정의되지 않은 색인 참조).

    이 예제는 훨씬 간단 해졌습니다. 대부분의 경우 그러한 알림은 검사되지 않은 반환 값을 알려줍니다. 라이브러리가 객체가 없거나 예상치 못한 비 객체 값 (예 : Xpath 결과, 예기치 않은 형식의 JSON 구조, 예기치 않은 형식의 XML 등) 인 경우 NULL을 반환하지만 코드는 이러한 조건을 검사하지 않습니다.

    비 객체가 종종 더 자주 처리되기 때문에 비 객체에서 객체 메소드를 호출 할 때 치명적인 오류가 발생합니다 (치명적 오류 : 비 객체의 멤버 함수 호출 ... 참조). 스크립트.

    오류 조건을 확인하거나 변수가 예상과 일치하는지 여부를 쉽게 확인하여 예방할 수 있습니다. 여기에 DOMXPath 예제가있는 알림이 있습니다.

    $result  = $xpath->query("//*[@id='detail-sections']/div[1]");
    $divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object
    

    문제는 첫 번째 항목의 nodeValue 속성 (필드)이 $ result 컬렉션에 존재하는지 확인되지 않은 상태에서 액세스하는 것입니다. 대신 코드가 작동하는 객체에 변수를 할당하여 코드를보다 명확하게 만드는 것이 좋습니다.

    $result  = $xpath->query("//*[@id='detail-sections']/div[1]");
    $div     = $result->item(0);
    $divText = "-/-";
    if ($div) {
        $divText = $div->nodeValue;
    }
    echo $divText;
    

    관련 오류 :

  23. ==============================

    23.

    (경고의 더 일반적인 변형 : mysql_fetch_array ()는 매개 변수 1이 resource 일 것으로 기대하고, 부울은 주어진다)

    리소스는 PHP의 유형 (문자열, 정수 또는 객체)입니다. 자원은 본질적으로 의미있는 자체 가치가없는 불투명 한 얼룩입니다. 리소스는 특정 PHP 함수 또는 확장 집합에 고유하고 정의됩니다. 예를 들어, Mysql 확장은 두 가지 자원 유형을 정의합니다.

    cURL 확장은 또 다른 두 가지 자원 유형을 정의합니다.

    var_dumped 일 때 값은 다음과 같습니다 :

    $resource = curl_init();
    var_dump($resource);
    
    resource(1) of type (curl)
    

    그 대부분의 자원은 특정 유형 ((컬))의 숫자 식별자 ((1))입니다.

    이러한 리소스를 가지고 다니면서 이러한 리소스가 의미하는 다양한 기능에 전달합니다. 일반적으로 이러한 함수는 백그라운드에서 특정 데이터를 할당하며 리소스는 내부적으로이 데이터를 추적하는 데 사용되는 참조입니다.

    "... 매개 변수 1은 리소스, 부울로 지정됩니다."오류는 일반적으로 리소스를 만들지는 않았지만 false를 반환하는 검사되지 않은 작업의 결과입니다. 예를 들어, fopen 함수에는 다음과 같은 설명이 있습니다.

    따라서이 코드에서 $ fp는 type (stream) 또는 false의 리소스 (x)가됩니다.

    $fp = fopen(...);
    

    fopen 연산이 성공했는지 실패했는지 확인하지 않고 $ fp가 유효한 리소스인지 아니면 false인지 그리고 $ fp를 리소스를 필요로하는 다른 함수에 전달하는지 여부를 확인하지 않으면 위의 오류가 발생할 수 있습니다.

    $fp   = fopen(...);
    $data = fread($fp, 1024);
    
    Warning: fread() expects parameter 1 to be resource, boolean given
    

    리소스를 할당하려고 시도하고 실패 할 수있는 함수의 반환 값을 항상 확인해야합니다.

    $fp = fopen(...);
    
    if (!$fp) {
        trigger_error('Failed to allocate resource');
        exit;
    }
    
    $data = fread($fp, 1024);
    

    관련 오류 :

  24. ==============================

    24.

    이것은 대괄호 구문을 사용하여 배열 요소에 액세스하려고 시도하지만 배열이 아닌 문자열에서이 작업을 수행 할 때 발생하므로 작업이 명확하게 이해되지 않습니다.

    예:

    $var = "test";
    echo $var["a_key"];
    

    변수가 배열이어야한다고 생각되면 그 변수가 어디에서 왔는지 확인하고 거기에서 문제를 수정하십시오.

  25. ==============================

    25.

    PHP 코드의 결과가 전혀 보이지 않거나 리터럴 PHP 소스 코드 출력의 일부가 웹 페이지에 표시되는 경우 PHP가 실제로 실행되지 않는다고 확신 할 수 있습니다. 브라우저에서 소스보기를 사용하면 전체 PHP 소스 코드 파일을 그대로 볼 수 있습니다. PHP 코드는 태그에 내장되어 있기 때문에 브라우저는이를 HTML 태그로 해석하려고 시도하며 결과가 다소 혼란스럽게 보일 수 있습니다.

    실제로 PHP 스크립트를 실행하려면 다음이 필요합니다.

    * 재구성하지 않으면 모든 것을 구성 할 수 있습니다.

    이 마지막 것은 특히 중요합니다. 파일을 두 번 클릭하기 만하면 브라우저에서 다음과 같은 주소를 사용하여 열 수 있습니다.

    file://C:/path/to/my/file.php
    

    실행중인 웹 서버를 완전히 우회하고 파일이 해석되지 않습니다. 다음과 같은 웹 서버의 파일 URL을 방문해야합니다.

    http://localhost/my/file.php
    

    짧은 태그를 사용하고 있는지 확인할 수도 있습니다

    또한 PHP 코드가 실행되고 있지 않음을 알 수 있습니다. 대신 페이지에 코드 쇼가 표시됩니다.

  26. ==============================

    26.

    이 경고는 유효하지 않거나 누락 된 자격 증명 (사용자 이름 / 암호)이있는 MySQL / MariaDB 서버에 연결할 때 나타납니다. 따라서 이것은 일반적으로 코드 문제는 아니지만 서버 구성 문제입니다.

    더 많은 참조 :

  27. ==============================

    27.

    이것은 배열을 문자열로 취급하려고하면 간단히 발생합니다 :

    $arr = array('foo', 'bar');
    
    echo $arr;  // Notice: Array to string conversion
    $str = 'Something, ' . $arr;  // Notice: Array to string conversion
    

    결과가 잘 정의되어 있지 않기 때문에 단순히 배열을 에코하거나 문자열로 연결할 수 없습니다. PHP는 배열 대신 "Array"라는 문자열을 사용하고 의도 한 것이 아니며 여기에서 코드를 검사해야한다는 것을 지적하기 위해 통지를 트리거합니다. 아마 다음과 같은 것을 원할 것입니다 :

    echo $arr[0];  // displays foo
    $str = 'Something ' . join(', ', $arr); //displays Something, foo, bar
    

    또는 배열을 반복하십시오.

    foreach($arr as $key => $value) {
        echo "array $key = $value";
        // displays first: array 0 = foo
        // displays next:  array 1 = bar
    }
    

    이 알림이 예상치 못한 곳에서 나타나는 경우 문자열이라고 생각되는 변수는 실제로 배열입니다. 즉,이 변수를 원하는 문자열 대신 배열로 만드는 코드에 버그가 있음을 의미합니다.

  28. ==============================

    28.

    'Division by zero'라는 경고 메시지는 새로운 PHP 개발자들 사이에서 가장 자주 묻는 질문 중 하나입니다. 이 오류로 인해 예외가 발생하지 않으므로 일부 개발자는 표현식 앞에 오류 억제 연산자 @를 추가하여 경고를 표시하지 않을 수도 있습니다. 예 :

    $value = @(2 / 0);
    

    그러나 모든 경고와 마찬가지로 최선의 방법은 경고의 원인을 추적하여 해결하는 것입니다. 경고의 원인은 0으로 나누는 경우, 0과 같은 변수 또는 할당되지 않은 변수 (NULL == 0이므로)가 결과가 '정의되지 않음'때문에 발생합니다.

    이 경고를 수정하려면 값이 0이 아닌지 확인하기 위해 식을 다시 작성해야합니다. 그렇지 않으면 다른 작업을 수행해야합니다. 값이 0 인 경우에는 나누지 않거나 값을 1로 변경 한 다음 나눗셈을 수행하여 추가 변수로만 나눈 것과 동일한 결과가 나옵니다.

    if ( $var1 == 0 ) { // check if var1 equals zero
        $var1 = 1; // var1 equaled zero so change var1 to equal one instead
        $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
    } else {
        $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
    }
    

    관련 질문 :

  29. ==============================

    29.

    클래스에서 정적이 아닌 메서드를 정적으로 호출하려고 할 때 발생하며 error_reporting () 설정에서 E_STRICT 플래그도 갖습니다.

    예 :

    class HTML {
       public function br() {
          echo '<br>';
       }
    }
    

    HTML :: br () 또는 $ html :: br ()

    error_reporting ()에 E_STRICT를 추가하지 않으면 실제로이 오류를 피할 수 있습니다.

    error_reporting(E_ALL & ~E_STRICT);
    

    PHP 5.4.0 이상에서는 E_ALLIC [ref]에 E_STRICT가 포함되어 있습니다. 그러나 그것은 조언할만한 것이 아닙니다. 해결 방법은 의도 한 정적 함수를 실제 정적으로 정의하는 것입니다.

    public static function br() {
      echo '<br>';
    }
    

    또는 함수를 일반적으로 다음과 같이 호출하십시오.

    $html = new HTML();
    $html->br();
    

    관련 질문 :

  30. ==============================

    30.

    클래스가 여러 특성을 사용하려고 시도 할 때 발생합니다. 특성 중 두 개 이상이 같은 이름으로 속성을 정의하고 속성의 초기 값이 다릅니다.

    예:

    <?php
    trait TraitA
    {
        public $x = 'a';
    }
    trait TraitB
    {
        public $x = 'b';
    }
    class ClassC
    {
        use TraitA, TraitB;
    }
    

    문제 : 경쟁 방식 간의 충돌을 해결하는 것이 가능하지만 현재 경쟁하는 두 속성 사이의 충돌을 해결할 구문은 없습니다. 이 때 유일한 해결책은 리팩터링하는 것입니다. 즉 치명적인 오류를 생성하는 속성 이름 사이의 충돌을 피하십시오.

    관련 질문 :

  31. from https://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php by cc-by-sa and MIT lisence