woniper

[PHP] general function을 static function 처럼 호출하게 되면... 본문

장애해결

[PHP] general function을 static function 처럼 호출하게 되면...

woniper1 2016. 8. 10. 11:04
  • PHP Version : 5.4.1
  • Codeigniter Version : 1.7.2

  회사 레거시 코드가 php이다. 어디선가 500error가 계속 떨어진걸 확인했는데 아무리 찾아도 어딘지 잘 모르겠다. 에러 로그를 보니 Using $this when not in object context 라는 에러가 계속 떨어지는걸 확인했다.

아래 예시 코드를 보고 어떤 상황인지 확인해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Foo {
    // static function
    public static function foo() {
        Bar::bar();
    }
}
 
public class Bar {
    // general function
    public function bar() {
        $this->callBar(); // Using $this when not in object context
    }
 
    private function callBar() {
        
    }
}
cs


  foo function(3라인)을 보면 Bar클래스에 bar function을 호출한다. 그런데 이상하게도 bar function은 static function이 아니기 때문에 저렇게 호출하면 안될거 같다. 하지만 호출이 된다. (미칠 노릇이다.)

  호출이 되는것도 모자라 정상적으로 bar function에 로직이 동작한다. 하지만 Using $this when not in object context 라는 에러가 나는 시점은 바로 내부 function인 callBar function을 호출하는 11라인에서 발생한다. 기존 소스가 이렇게 작성이 되어 있었는데 내가 수정해서 올린 부분이 바로 11라인과 같이 내부 function을 호출하는 부분인데 Foo 클래스에 foo function과 같이 일반 function을 static function 처럼 호출하는 부분이 있다는걸 상상도 못했다. 왜 저렇게 호출했나 로그를 확인해보니 bar function이 기존에는 static function이였던 것이고, general function으로 수정한 후 foo function에서 bar function call 하는 부분(4라인)을 미처 수정하지 못한 것이다.


해결 코드

1
2
3
4
5
6
7
public class Foo {
    // static function
    public static function foo() {
        $bar = new Bar();
        $bar->bar();
    }
}
cs


Codeigniter에서는 예시로 보여준 Bar 클래스가 library였기 때문에 아래와 같이 호출해서 사용해야한다.

1
2
3
4
5
6
7
8
public class Foo {
    // static function
    public static function foo() {
        $CI = &get_instance();
        $CI->load->library('Bar', '' , 'bar');
        $CI->bar->bar();
    }
}
cs

버전에 따라 영향이 있는지는 확인해보지 않아서 잘 모르겠다.


자바하고싶다.

Comments