문제가 있습니다 :
프레임 워크없이 새로운 WebApp을 작성하고 있습니다.
내 index.php에서 나는 다음을 사용하고있다 :require_once('load.php');
그리고에 load.php 내가 사용하고 require_once('class.php');
내로드 class.php을 .
내 class.php 에서이 오류가 발생했습니다 :
치명적인 오류 : class.php의 객체 컨텍스트에 없을 때 $ this 사용 … (이 예제에서는 11입니다)
내 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();
왜 오류가 발생합니까?
답변
내 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 foo() {
return self::$foo;
}
그런 다음 이것을 사용할 수 있습니다 :
foobar::foobarfunc();
답변
정적이 아닌 메소드를 호출하고 있습니다.
public function foobarfunc() {
return $this->foo();
}
정적 호출 사용 :
foobar::foobarfunc();
정전기 전화를 사용하는 경우, 함수가 호출됩니다 (으로 선언되지 않더라도 static
) 객체의 어떤 인스턴스가 없기 때문에,하지만, 전혀 없다 $this
.
그래서 :
- 비 정적 메소드에 정적 호출을 사용해서는 안됩니다.
- 정적 메서드 (또는 정적으로 호출되는 메서드)는 정적 호출을 사용할 때 클래스 인스턴스가 없기 때문에 일반적으로 클래스의 현재 인스턴스를 가리키는 $ this를 사용할 수 없습니다.
여기에서 클래스의 메서드는 클래스의 $foo
속성에 액세스해야하므로 클래스의 현재 인스턴스를 사용하고 있습니다.
즉, 메소드에는 클래스의 인스턴스가 필요합니다. 즉, 정적 일 수 없습니다.
이것은 정적 호출을 사용해서는 안된다는 것을 의미합니다. 클래스의 인스턴스를 작성하고 객체를 사용하여 마지막 코드 부분에서와 같이 메소드를 호출해야합니다.
$foobar = new foobar();
$foobar->foobarfunc();
자세한 내용은 PHP 매뉴얼에서 주저하지 말고 읽으십시오.
또한 __construct
메소드 에이 줄이 필요하지 않을 수도 있습니다 .
global $foo;
global
키워드 를 사용하면 $foo
모든 함수와 클래스 외부에서 선언 된 변수를 해당 메소드 내부에서 볼 수있게 만들 것입니다. 그리고 아마도 그러한 $foo
변수 가 없을 것입니다 .
$foo
클래스 속성에 액세스하려면 $this->foo
했던 것처럼 을 사용해야 합니다.
답변
해결 범위 연산자 ( ) 를 사용 foobarfunc
하여 호출하는 경우 인스턴스 수준 대신 클래스 수준에서 정적으로 호출 하므로 개체 컨텍스트에 없을 때 사용하고 있습니다. 클래스 컨텍스트에 존재하지 않습니다.::
$this
$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 ()를 반환했습니다. 이제 이건 아무것도 아닙니다. 그것이 class.php의 객체 컨텍스트에 있지 않을 때 $ this를 사용하는 이유입니다.
솔루션 :
-
객체를 만들고 foobarfunc ()를 호출하십시오.
-
foobarfunc () 내부의 클래스 이름을 사용하여 foo ()를 호출하십시오.
답변
정적 컨텍스트에서 함수를 호출하면 $this
단순히 존재하지 않습니다.
this::xyz()
대신 사용해야 합니다.
함수를 정적으로 또는 객체 인스턴스에서 호출 할 수있는 상황에 대해 알아 보려면이 질문에 좋은 접근 방식이 설명되어 있습니다. 정적인지 객체인지 어떻게 알 수 있습니까?
답변
빠른 방법 : (new foobar ())-> foobarfunc ();
클래스 replace를로드해야합니다.
foobar::foobarfunc();
으로 :
(new foobar())->foobarfunc();
또는 :
$Foobar = new foobar();
$Foobar->foobarfunc();
또는 사용할 정적 함수를 만듭니다 foobar::
.
class foobar {
//...
static function foobarfunc() {
return $this->foo();
}
}
답변
$foobar = new foobar;
foobar 클래스를 객체가 아닌 $ foobar에 넣습니다 . 객체를 얻으려면 괄호를 추가해야합니다.$foobar = new foobar();
귀하의 오류가 그래서 거기, 당신은 클래스의 메소드를 호출 단순히 없습니다 $this
때문에 $this
개체 만 존재합니다.