클래스 내에서 정적 메서드를 호출할 수 있습니까?
같은 클래스 내의 다른 메서드에서 정적 메서드를 호출하려면 어떻게 해야 합니까?
$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();
}
}
클래스 내의 정적 메서드를 호출하다
className::staticFunctionName
예
ClassName::staticMethod();
언급URL : https://stackoverflow.com/questions/2204018/call-a-static-method-inside-a-class
'programing' 카테고리의 다른 글
플라스크에서 정적 파일을 처리하는 방법 (0) | 2023.01.14 |
---|---|
Pylint 경고를 비활성화하려면 어떻게 해야 합니까? (0) | 2023.01.14 |
멀티레벨 어레이를 사람이 읽을 수 있는 형식으로 출력하려면 어떻게 해야 합니까? (0) | 2023.01.14 |
전체 MySQL 데이터베이스 복제 (0) | 2023.01.14 |
최대 절전 모드에서 생성된 DDL의 구문 오류 "type= MyISAM"이 잘못되었습니다. (0) | 2023.01.14 |