복붙노트

PHP 치명적인 오류 : 객체 컨텍스트가 아닌 경우 $ this 사용

PHP

PHP 치명적인 오류 : 객체 컨텍스트가 아닌 경우 $ this 사용

문제가 있습니다.

프레임 워크없이 새로운 웹 애플리케이션을 작성하고 있습니다.

내 index.php에서 사용하고 있습니다 : require_once ( 'load.php');

그리고 load.php에서 require_once ( 'class.php');를 사용하고 있습니다. 내 class.php를로드하는 중입니다.

내 class.php에서 나는이 오류가있어 :

class.php가 어떻게 쓰여지는지 예제 :

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

    public function foo() {
        return $this->foo;
    }
}

내 index.php에서 아마 foobarfunc () 같은로드 할 :

foobar::foobarfunc();

하지만 또한 수 있습니다.

$foobar = new foobar;
$foobar->foobarfunc();

오류가 왜 발생합니까?

해결법

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

    1.

     foobar::foobarfunc();  // Wrong, it is not static method
    
    $foobar = new foobar;  // correct
    $foobar->foobarfunc();
    

    정적 메서드가 아니기 때문에이 방법으로 메서드를 호출 할 수 없습니다.

    foobar::foobarfunc();
    

    대신 다음을 사용해야합니다.

    foobar->foobarfunc();
    

    그러나 다음과 같은 정적 메서드를 만든 경우 :

    static $foo; // your top variable set as static
    
    public static function foo() {
        return self::$foo;
    }
    

    다음 이것을 사용할 수 있습니다 :

    foobar::foobarfunc();
    
  2. ==============================

    2.비 정적 메서드 호출 :

    비 정적 메서드 호출 :

    public function foobarfunc() {
        return $this->foo();
    }
    

    정적 호출 사용 :

    foobar::foobarfunc();
    

    정적 호출을 사용할 때, 함수는 정적으로 선언되지 않더라도 호출되지만, 객체의 인스턴스가 없으므로 $ this가 없습니다.

    그래서 :

    클래스의 메소드는 클래스의 $ foo 속성에 액세스해야하므로 클래스의 현재 인스턴스를 사용하고 있습니다.

    즉, 메서드에 클래스의 인스턴스가 필요하다는 것을 의미합니다. 즉 정적 일 수는 없습니다.

    즉, 정적 호출을 사용하면 안됩니다. 코드의 마지막 부분에서와 같이 클래스를 인스턴스화하고 객체를 사용하여 메소드를 호출해야합니다.

    $foobar = new foobar();
    $foobar->foobarfunc();
    

    PHP 매뉴얼에서 더 많은 정보를 얻으실 수 있습니다.

    또한 __construct 메서드에서이 줄이 필요하지 않을 수도 있습니다.

    global $foo;
    

    global 키워드를 사용하면 모든 함수와 클래스 외부에서 선언 된 $ foo 변수가 해당 메서드 내부에서 볼 수 있습니다. 그리고 아마도 $ foo 변수는 없습니다.

    $ foo 클래스 속성에 액세스하려면 $ this-> foo 만 사용해야합니다.

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

    3.해결 범위 연산자 (: :)를 사용하여 foobarfunc를 호출하면 정적으로 호출합니다. 인스턴스 수준이 아닌 클래스 수준에서 사용하므로 개체 컨텍스트가 아닌 경우 $ this를 사용하고 있습니다. $ this는 클래스 컨텍스트에 존재하지 않습니다.

    해결 범위 연산자 (: :)를 사용하여 foobarfunc를 호출하면 정적으로 호출합니다. 인스턴스 수준이 아닌 클래스 수준에서 사용하므로 개체 컨텍스트가 아닌 경우 $ this를 사용하고 있습니다. $ this는 클래스 컨텍스트에 존재하지 않습니다.

    E_STRICT를 활성화하면 PHP는 다음에 대한 통지를 제기합니다.

    Strict Standards: 
    Non-static method foobar::foobarfunc() should not be called statically
    

    대신해라.

    $fb = new foobar;
    echo $fb->foobarfunc();
    

    sidenote에서 클래스 내에서 전역을 사용하지 않는 것이 좋습니다. 만약 당신이 수업 내외에서 필요한 것이 있으면 생성자를 통해 전달하십시오. 이것을 Dependency Injection이라고 부르며 코드를 외부 유지 보수에 덜 의존적으로 만듭니다.

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

    4.먼저 한 가지를 이해합니다. $는 클래스 내부에서 현재 객체를 나타냅니다. 클래스 함수 또는 변수를 호출하기 위해 클래스의 외부에 생성 된 것은 것입니다.

    먼저 한 가지를 이해합니다. $는 클래스 내부에서 현재 객체를 나타냅니다. 클래스 함수 또는 변수를 호출하기 위해 클래스의 외부에 생성 된 것은 것입니다.

    따라서 foobar :: foobarfunc ()와 같은 클래스 함수를 호출하면 객체가 생성되지 않습니다. 하지만 그 함수 안에서는 $ this-> foo ()를 반환했습니다. 이제 여기 $는 아무것도 아닙니다. 그 이유는 class.php의 객체 컨텍스트에 없을 때 $ this를 사용하는 것입니다.

    솔루션 :

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

    5.정적 컨텍스트에서 함수를 호출하면 $ this는 단순히 존재하지 않습니다.

    정적 컨텍스트에서 함수를 호출하면 $ this는 단순히 존재하지 않습니다.

    대신 this :: xyz ()를 사용해야합니다.

    함수가 정적으로 또는 객체 인스턴스에서 호출 될 수있는 상황을 확인하려면 다음과 같은 질문에 대한 좋은 접근 방법이 설명됩니다. 정적인지 또는 객체인지를 나타내는 방법

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

    6.클래스를로드해야합니다.

    클래스를로드해야합니다.

    foobar::foobarfunc();
    

    기준 :

    (new foobar())->foobarfunc();
    

    또는 :

    $Foobar = new foobar();
    $Foobar->foobarfunc();
    

    또는 foobar ::를 사용하는 정적 함수를 만듭니다.

    class foobar {
        //...
    
        static function foobarfunc() {
            return $this->foo();
        }
    }
    
  7. ==============================

    7.$ foobar = 새로운 foobar; foobar 클래스를 객체가 아닌 $ foobar에 넣으십시오. 객체를 얻으려면 괄호를 추가해야합니다 : $ foobar = new foobar ();

    $ foobar = 새로운 foobar; foobar 클래스를 객체가 아닌 $ foobar에 넣으십시오. 객체를 얻으려면 괄호를 추가해야합니다 : $ foobar = new foobar ();

    오류는 단순히 클래스에 대한 메서드를 호출하므로 $ this는 객체에만 존재하기 때문에 $ this가 없습니다.

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

    8.이 foobar-> foobarfunc ()를 사용하여 Class 메소드를 사용하면된다.

    이 foobar-> foobarfunc ()를 사용하여 Class 메소드를 사용하면된다.

  9. from https://stackoverflow.com/questions/2350937/php-fatal-error-using-this-when-not-in-object-context by cc-by-sa and MIT license