아래 코드가 PHP 5.6부터 에러라고 하는데...왜 ? 채택완료

<?php
class A {
    function f() { echo get_class($this); }
}

class B {
    function f() { A::f(); }
}

(new B)->f();
?>

 

 

결과값:

Deprecated: Non-static method A::f() should not be called statically in C:\laragon\www\index.php on line 7

Fatal error: Uncaught Error: Using $this when not in object context in C:\laragon\www\index.php:3 Stack trace: #0 C:\laragon\www\index.php(7): A::f() #1 C:\laragon\www\index.php(10): B->f() #2 {main} thrown in C:\laragon\www\index.php on line 3

 

 

위 내용을 쉽게 풀어서 설명 가능하실까요?

위 코드가 에러 안 나게 하려면 어떻게 처리해야 하는지 궁금합니다.

답변 2개

채택된 답변
+20 포인트

정적 메소드가 아닌데 정적으로 호출하고 있다는 에러입니다.

 

본래 PHP 에서 유연하게 처리해줬을 뿐이지

객체지향 언어의 기본격인 C++, Java 에서도 저렇게 사용하면 에러입니다.

인스턴스를 생성하고 해당 인스턴스로 접근을 해야합니다.

 

Copy
<?php
class A {
    function f() { echo get_class($this); }
}

class B {
    // function f() { A::f(); }
    function f() { (new A)->f(); }
}

(new B)->f();
?>

 

정적으로 호출하려면 정적키워드인 static 을 기술해야 합니다.

Copy
<?php

class C {
    private $a;
    private static $c;
    
    public function __construct() {
        $this->a = new A();
        self::$c = 'this is static variable';
    }
    
    public function f() { $this->a->f(); }
    public static function staticF() { echo 'this is static method'; }
    public static function staticC() { echo self::$c; }
}

(new C)->f();
C::staticF();
C::staticC();

?>
로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

자세한 설명 감사합니다.
아직 공부가 부족해 100% 이해는 못 했지만, 큰 도움이 되었습니다.

댓글을 작성하려면 로그인이 필요합니다.

https://stackoverflow.com/questions/11237511/multiple-ways-of-calling-parent-method-in-php

원하시는 것이 이런 형태같군요

class B {

    function f() { parent::f(); }

}

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

이미 채택된 질문에 관심 갖고 답변 남겨주셔서 정말 감사합니다.
( ^ __________ ~ ) ===b
게을러서
댓글을 늦게 달았네요. ^^

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고