PHP 치명적인 오류 : 객체 컨텍스트가 아닌 경우 $ this 사용
PHPPHP 치명적인 오류 : 객체 컨텍스트가 아닌 경우 $ 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.
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.비 정적 메서드 호출 :
비 정적 메서드 호출 :
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.해결 범위 연산자 (: :)를 사용하여 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.먼저 한 가지를 이해합니다. $는 클래스 내부에서 현재 객체를 나타냅니다. 클래스 함수 또는 변수를 호출하기 위해 클래스의 외부에 생성 된 것은 것입니다.
먼저 한 가지를 이해합니다. $는 클래스 내부에서 현재 객체를 나타냅니다. 클래스 함수 또는 변수를 호출하기 위해 클래스의 외부에 생성 된 것은 것입니다.
따라서 foobar :: foobarfunc ()와 같은 클래스 함수를 호출하면 객체가 생성되지 않습니다. 하지만 그 함수 안에서는 $ this-> foo ()를 반환했습니다. 이제 여기 $는 아무것도 아닙니다. 그 이유는 class.php의 객체 컨텍스트에 없을 때 $ this를 사용하는 것입니다.
솔루션 :
-
==============================
5.정적 컨텍스트에서 함수를 호출하면 $ this는 단순히 존재하지 않습니다.
정적 컨텍스트에서 함수를 호출하면 $ this는 단순히 존재하지 않습니다.
대신 this :: xyz ()를 사용해야합니다.
함수가 정적으로 또는 객체 인스턴스에서 호출 될 수있는 상황을 확인하려면 다음과 같은 질문에 대한 좋은 접근 방법이 설명됩니다. 정적인지 또는 객체인지를 나타내는 방법
-
==============================
6.클래스를로드해야합니다.
클래스를로드해야합니다.
foobar::foobarfunc();
기준 :
(new foobar())->foobarfunc();
또는 :
$Foobar = new foobar(); $Foobar->foobarfunc();
또는 foobar ::를 사용하는 정적 함수를 만듭니다.
class foobar { //... static function foobarfunc() { return $this->foo(); } }
-
==============================
7.$ foobar = 새로운 foobar; foobar 클래스를 객체가 아닌 $ foobar에 넣으십시오. 객체를 얻으려면 괄호를 추가해야합니다 : $ foobar = new foobar ();
$ foobar = 새로운 foobar; foobar 클래스를 객체가 아닌 $ foobar에 넣으십시오. 객체를 얻으려면 괄호를 추가해야합니다 : $ foobar = new foobar ();
오류는 단순히 클래스에 대한 메서드를 호출하므로 $ this는 객체에만 존재하기 때문에 $ this가 없습니다.
-
==============================
8.이 foobar-> foobarfunc ()를 사용하여 Class 메소드를 사용하면된다.
이 foobar-> foobarfunc ()를 사용하여 Class 메소드를 사용하면된다.
from https://stackoverflow.com/questions/2350937/php-fatal-error-using-this-when-not-in-object-context by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
동적 드롭 다운 상자? (0) | 2018.09.08 |
---|---|
PCRE / PHP에서 일치하는 유니 코드 문자 (0) | 2018.09.08 |
평범한 사람은 PHP를 사용하는 재귀 함수 란 무엇입니까? (0) | 2018.09.08 |
어떻게 PHP에서 문자열의 16 진 덤프를 얻을 수 있습니까? (0) | 2018.09.07 |
사용되지 않는 함수 : mysql_connect () (0) | 2018.09.07 |