[php] 클래스 내에서 정적 메소드를 호출합니까?

같은 클래스 내의 다른 메소드에서 정적 메소드를 어떻게 호출합니까?

$this->staticMethod();

또는

$this::staticMethod();



답변


답변

이것이 당신의 수업이라고 가정 해 봅시다.

class Test
{
    private $baz = 1;

    public function foo() { ... }

    public function bar() 
    {
        printf("baz = %d\n", $this->baz);
    }

    public static function staticMethod() { echo "static method\n"; }
}

foo()방법 내 에서 다른 옵션을 살펴 보겠습니다.

$this->staticMethod();

staticMethod()인스턴스 메소드로 호출 하는 것이 맞습니까? 그렇지 않습니다. public static인터프리터가 정적 메소드로 호출 할 때 메소드가 선언 되었으므로 예상대로 작동합니다. 그렇게하면 정적 메소드 호출이 발생하고 있음을 코드에서 덜 명확하게 할 수 있다고 주장 할 수 있습니다.

$this::staticMethod();

PHP 5.3부터는 다음 $var::method()을 의미 할 수 있습니다 <class-of-$var>::. 위의 사용 사례는 여전히 전통적이지 않지만 이것은 매우 편리합니다. 따라서 정적 메소드를 호출하는 가장 일반적인 방법이 있습니다.

self::staticMethod();

당신은이 생각을 시작하기 전에 지금 ::이다 정적 호출 연산자는, 내가 당신에게 또 다른 예를 해주지 :

self::bar();

이것은 인쇄 할 수 baz = 1있는 수단이, $this->bar()그리고 self::bar()정확히 같은 일을 할; 그것은 ::단지 범위 확인 연산자 이기 때문 입니다. 그것은이 만드는의 parent::, self::그리고 static::작업하고 정적 변수에 대한 액세스를 제공을; 메소드의 호출 방법은 서명 및 호출자의 호출 방법에 따라 다릅니다.

이 모든 것을 실제로 보려면 이 3v4l.org 출력을 참조하십시오 .


답변

이것은 매우 늦은 답변이지만 이전 답변에 대한 세부 정보를 추가합니다

동일한 클래스의 다른 정적 메소드에서 PHP의 정적 메소드를 호출하는 self경우 클래스 이름 을 구별하는 것이 중요합니다 .

이 코드를 예로 들어 보겠습니다.

class static_test_class {
    public static function test() {
        echo "Original class\n";
    }

    public static function run($use_self) {
        if($use_self) {
            self::test();
        } else {
            $class = get_called_class();
            $class::test(); 
        }
    }
}

class extended_static_test_class extends static_test_class {
    public static function test() {
        echo "Extended class\n";
    }
}

extended_static_test_class::run(true);
extended_static_test_class::run(false);

이 코드의 출력은 다음과 같습니다.

오리지널 클래스

확장 수업

self호출되는 코드의 클래스가 아니라 코드가있는 클래스를 참조하기 때문 입니다.

원래 클래스를 상속하는 클래스에 정의 된 메소드를 사용하려면 다음과 같은 것을 사용해야합니다.

$class = get_called_class();
$class::function_name(); 


답변

이후의 PHP 버전 self::staticMethod();에서도 작동하지 않습니다. 엄격한 표준 오류가 발생합니다.

이 경우 같은 클래스의 객체를 생성하고 객체별로 호출 할 수 있습니다

여기에 예가 있습니다

class Foo {

    public function fun1() {
        echo 'non-static';   
    }

    public static function fun2() {
        echo (new self)->fun1();
    }
}


답변