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」를.
- [ Classes and Objects ]섹션
- [ Static Keyword ]페이지가 표시됩니다.
아마 이 거예요, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.__construct
삭제:
global $foo;
이 키워드를 사용하면,$foo
변수, 모든 함수 및 클래스 외부에 선언됨, 해당 메서드 내부에서 가시성...그리고 당신은 아마 그런 걸 가지고 있지 않을 거예요.$foo
★★★★★★ 。
하려면$foo
class-interval, 사용만 하면 됩니다.$this->foo
네가 한 것처럼.
「」를 하고 있는 foobarfunc
(해상도 범위 연산자 포함)::
인스턴스 레벨이 아닌 클래스레벨로 스태틱하게 콜하고 있기 때문에 오브젝트 컨텍스트가 아닌 경우에 사용합니다. $this
는 클래스 컨텍스트에 존재하지 않습니다.
유효하게 하는 경우E_STRICT
PHP는 이에 대한 알림을 보냅니다.
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
솔루션:
오브젝트를 생성하여 foobarfunc()를 호출합니다.
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
'programing' 카테고리의 다른 글
set_time_limit()와 ini_set의 차이('max_execution_time', ...) (0) | 2022.09.29 |
---|---|
시간대 문제를 수정하기 위해 추가 파라미터를 MariaDB 연결 문자열에 전달하는 방법(예: useLegacyDatetimeCode) (0) | 2022.09.29 |
오류 2002(HY000):소켓 '/var/run/mysql'을 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말' (2) (0) | 2022.09.25 |
JPA 및 휴지 상태 사용 시 동일 및 해시 코드 구현 방법 (0) | 2022.09.25 |
조인을 사용하려고 할 때 SQL 구문에 오류가 발생함 (0) | 2022.09.25 |