클래스 내에서 정적 메소드를 호출합니까?
같은 클래스 내의 다른 메소드에서 정적 메소드를 어떻게 호출합니까?
$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();
}
}
참고 URL : https://stackoverflow.com/questions/2204018/call-a-static-method-inside-a-class
'IT' 카테고리의 다른 글
경고 : 'characters'는 더 이상 사용되지 않습니다 : String 또는 Substring을 직접 사용하십시오 (0) | 2020.06.09 |
---|---|
docker-compose를 사용하여 항상 새로운 이미지에서 컨테이너를 다시 만드는 방법은 무엇입니까? (0) | 2020.06.09 |
자바에서 문자열의 바이트 (0) | 2020.06.08 |
Java에서 &와 &&의 차이점은 무엇입니까? (0) | 2020.06.08 |
이진 파일을 비교하여 동일한 지 확인하는 방법은 무엇입니까? (0) | 2020.06.08 |