같은 클래스 내의 다른 메소드에서 정적 메소드를 어떻게 호출합니까?
$this->staticMethod();
또는
$this::staticMethod();
답변
self::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();
}
}