programing

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

projobs 2022. 9. 29. 21:54
반응형

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

문제가 생겼어요.

프레임워크 없이 새로운 웹앱을 작성하고 있습니다.

사용 중인 인덱스.php:require_once('load.php');

부하도 있고php 사용중require_once('class.php');수업을 싣기 위해.

우리 반에서.php 이 에러가 발생했습니다.

치명적인 오류:클래스에서 오브젝트 컨텍스트가 아닌 경우 $this를 사용합니다.php 온라인...(이 예에서는 11이 됩니다)

우리 반의 예를 들어보자.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;
    }
}

인덱스.php에 로드하는 중인데foobarfunc()음음음같 뭇매하다

foobar::foobarfunc();

하지만 그럴 수도 있다.

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

에러가 발생하는 이유는 무엇입니까?

index.php에서 foobarfunc()를 로드합니다.

 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 foobarfunc() {
    return self::$foo;
}

다음 명령을 사용할 수 있습니다.

foobar::foobarfunc();

비정적 메서드를 호출하고 있습니다.

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

static-call 사용:

foobar::foobarfunc();

스태틱 콜을 사용하는 경우 함수는 호출되지만(로 선언되지 않은 경우에도), 오브젝트의 인스턴스가 없기 때문에 존재하지 않습니다.$this.

따라서:

  • 스태틱 이외의 메서드에는 스태틱콜을 사용하지 마십시오.
  • 스태틱 메서드(또는 스태틱 호출된 메서드)에서는 $this를 사용할 수 없습니다.이것은 스태틱콜을 사용할 때 클래스 인스턴스가 없기 때문에 보통 클래스의 현재 인스턴스를 가리킵니다.


클래스의 가 클래스의를 사용하고 메서드는 .이러한 메서드는 이 인스턴스에 액세스 할 필요가 있기 때문입니다.$foo클래스 속성

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

즉, 스태틱콜을 사용하지 않는 것을 의미합니다.클래스를 인스톨 하고 오브젝트를 사용하여 코드의 마지막 부분에서와 같이 메서드를 호출해야 합니다.

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


것에 대하여는의 「PHP」를.


아마 이 거예요, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.__construct 삭제:

global $foo;

키워드를 사용하면,$foo변수, 모든 함수 및 클래스 외부에 선언됨, 해당 메서드 내부에서 가시성...그리고 당신은 아마 그런 걸 가지고 있지 않을 거예요.$foo★★★★★★ 。

하려면$foo class-interval, 사용만 하면 됩니다.$this->foo네가 한 것처럼.

「」를 하고 있는 foobarfunc(해상도 범위 연산자 포함)::인스턴스 레벨이 아닌 클래스레벨로 스태틱하게 콜하고 있기 때문에 오브젝트 컨텍스트가 아닌 경우에 사용합니다. $this는 클래스 컨텍스트에 존재하지 않습니다.

유효하게 하는 경우E_STRICTPHP는 이에 대한 알림을 보냅니다.

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

대신 이렇게 해 주세요.

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

사이드노트에서는, 다음의 것을 사용하지 않는 것을 추천합니다.global수업 중에 말이야교실 밖에서 필요한 것이 있으면 컨스트럭터를 통해 전달해 주세요.이것은 의존성 주입이라고 불리며 코드를 훨씬 더 쉽게 유지 관리할 수 있게 하고 외부 항목에 덜 의존하게 만듭니다.

먼저 클래스 내의 $this는 현재 객체를 나타냅니다.
즉, 클래스 함수 또는 변수를 호출하기 위해 클래스 외부에서 생성됩니다.

따라서 foobar::foobarfunc()와 같은 클래스 함수를 호출할 경우 오브젝트는 생성되지 않습니다.그러나 당신이 쓴 함수 안에는 $this->foo()가 반환됩니다.이제 여기 $ 이건 아무것도 아니야.그렇기 때문에 클래스에서 오브젝트 컨텍스트가 아닐 때 $this를 사용한다고 되어 있습니다.php

솔루션:

  1. 오브젝트를 생성하여 foobarfunc()를 호출합니다.

  2. foobarfunc() 내의 클래스 이름을 사용하여 foo()를 호출합니다.

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

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

함수를 스태틱하게 호출할 수 있는 경우와 오브젝트인스턴스 내에서 호출할 수 있는 경우의 상황을 확인하려면 다음 질문에서 적절한 접근법에 대해 설명합니다.정적인지 물체인지 어떻게 구별하나요?

Fast 메서드 : (새로운 foobar()-> foobarfunc();

클래스 치환을 로드해야 합니다.

foobar::foobarfunc();

기준:

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

또는 다음과 같습니다.

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

또는 정적 기능을 사용하여foobar::.

class foobar {
    //...

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

PHP의 버그인 것 같습니다.에러

'치명적 오류:검출되지 않은 오류: 오브젝트 컨텍스트가 아닌 경우 $this 사용'

를 사용하여 함수에 표시됩니다.$this단, 콜링 함수가 스태틱으로 비스타틱함수를 사용하고 있는 것이 에러입니다.예:

Class_Name
{
    function foo()
    {
        $this->do_something(); // The error appears there.
    }
    function do_something()
    {
        ///
    }
}

오류 발생 시:

Class_Name::foo();

$foobar = new foobar;클래스 foobar를 객체가 아닌 $foobar에 넣습니다.개체를 가져오려면 괄호를 추가해야 합니다.$foobar = new foobar();

당신의 오류는 단순히 당신이 수업에서 메서드를 호출하는 것이기 때문에 존재하지 않는다.$this부터$this개체에만 존재합니다.

이 방법을 사용하여 Class 메서드를 사용합니다.foobar->foobarfunc();

언급URL : https://stackoverflow.com/questions/2350937/php-fatal-error-using-this-when-not-in-object-context

반응형