>백엔드 개발 >PHP 튜토리얼 >비정적 메소드를 PHP에서 정적으로 호출할 수 있습니까? (이상한 전화)

비정적 메소드를 PHP에서 정적으로 호출할 수 있습니까? (이상한 전화)

WBOY
WBOY원래의
2016-07-30 13:30:341352검색

1. PHP에서 비정적 메서드를 정적으로 호출할 수 있나요?

오늘 PHP에서 className::methodName() 메서드를 사용하여 정적으로 선언되지 않은 메서드를 호출할 수 있는지 질문을 받았습니다. 내 생각에는 이 사용법을 이전에 본 것 같지만 조금 확실하지 않습니다. 우리 모두 알고 있듯이 매뉴얼이나 튜토리얼에서 메서드는 정적 메서드와 비정적 메서드로 구분됩니다. 일반적으로 정적으로 호출하는 메서드는 정적 메서드여야 합니다.

비정적 메서드를 호출하면 어떻게 되나요? 먼저 테스트를 수행하십시오.

1 <?php

2classtest{

3 functiontest() {

4 echo'it works';

5 }

6}

7test::test();

8?>

다음을 실행하면 반환되는 오류는 다음과 같습니다. 다음과 같습니다:

1 Fatal error: Non-static method test::test() cannot be called statically in /home/×××/test.php

2 on line 7 Call Stack: 0.0002 332548 1. {main}() /home/×××/test.php:0

이때 호출이 정적이 아니라고 생각할 수도 있습니다. 하지만 실제로는 test() 메서드가 클래스와 이름이 같고 생성자 메서드이기 때문에 결론을 내리기에는 너무 이르습니다. 계속 테스트해 보겠습니다.

01 <?php

02classtest {

03 functiontest() {

04 echo'it works';

05 }

06 functiontest2() {

07 echo'it works too';

08 }

09}

10test::test2();

11?>

실행 결과:

1 it works too

이것은 , 비정적 메서드를 정적으로 호출하는 것은 가능하지만 생성자를 정적으로 호출하는 것은 허용되지 않습니다. 이 결론을 검증하기 위해 다음 테스트를 수행했습니다.

1 <?php

2classtest{

3 staticfunctiontest() {

4 echo'it works';

5 }

6}

7test::test();

8?>

실행 결과는 다음과 같습니다.

1 Fatal error: Constructor test::test() cannot be static in /home/xxx/test.php on line 9

생성자는 다음과 같습니다. static으로 선언되었습니다. 따라서 위의 추론은 정확합니다.

하지만 이 결과는 정말 특별합니다. PHP만이 비정적 메서드를 정적으로 호출할 수 있습니다. Java로 실험을 해 본 결과, 다음 오류가 보고됩니다:

1 Cannot make a static reference to the non-static method showString() from the type HelloWorldApp

다른 언어를 하나씩 시도해본 적은 없지만 이 정도면 충분합니다. PHP의 특수성을 설명하고 PHP에서 이 상황에 대한 관련 지침을 찾지 못한 이유를 설명합니다.

2. 비정적 메소드에 대한 정적 호출을 적용해야 합니까?

정적 메서드 대신 이 메서드를 사용할 수 있나요? 우선, 코드 가독성의 관점에서 비정적 메서드를 정적으로 호출하는 것은 물론 권장되지 않습니다. 이는 유지관리자를 혼란스럽게 할 것입니다.

다음으로 비정적 메서드를 정적으로 호출하는 것이 효율성 측면에서 어떤 이점이 있는지 알아보기 위해 몇 가지 실험을 수행해 보겠습니다.

1 <?php

2classtest{

3 functiontest2() { }

4}

<🎜 위의 코드 실행 시간은 18~28ms입니다. 표준 작성 방법을 테스트해 보겠습니다.

5

6for($k=0; $k<10000; $k&#43;&#43;) {

7 test::test2();

8}

9?>
비정적 메서드를 정적으로 호출하는 것은 권장되지 않습니다. 효율성 측면.

WordPress가 실제로 다음과 같은 이상한 호출 방법을 사용한다는 사실을 발견했습니다.

1 <?php

2classtest{
// 하위 문자열 일치 항목을 쿼리로 대체합니다.

$query = addlashes (WP_MatchesMapRegex::apply($query, $matches));

3 staticfunctiontest2(){ }
여기에서는 정적 호출이 사용되지만 실제 멤버 함수는 정적이 아닙니다.

4}

참고: PHP는 비정적 속성을 정적으로 호출할 수 없습니다

5

6for($k=0; $k<10000; $k&#43;&#43;) {

7 test::test2();

8}

9?>

5         echo'it works';

6     }

7 }

8 echotest::$id;

9 ?>

오류 보고:

1 Fatal error: Access

위 내용은 PHP에서 비정적 메서드를 정적으로 호출할 수 있는지 여부를 소개합니다. (이상한 소리) 내용의 측면을 포함하여, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.