PHP에서 정적 속성을 오버로드하는 기능이없는 이유는 무엇입니까?


13

소개

PHP를 사용하면 클래스에서 마법 메서드 를 선언하여 메서드 호출 및 속성 액세스 를 오버로드 할 수 있습니다 . 이를 통해 다음과 같은 코드를 사용할 수 있습니다.

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

PHP 5.3.0부터 인스턴스 속성과 메소드를 오버로드하는 것 외에도 staticmagic 메소드를 오버라이드하여 메소드 호출을 오버 로드 할 수 있습니다 __callStatic.

누락 된 뭔가

사용 가능한 기능에서 눈에 띄지 않는 점은 정적 속성 을 오버로드하는 기능입니다 .

echo Foo::$missingProperty; // fatal error: access to undeclared static property

이 제한은 명확하게 문서화되어 있습니다 :

속성 오버로딩은 개체 컨텍스트에서만 작동합니다. 이러한 매직 메소드는 정적 컨텍스트에서 트리거되지 않습니다. 따라서 이러한 방법을 선언해서는 안됩니다 static. PHP 5.3.0부터 매직 오버로드 메소드 중 하나가 선언되면 경고가 발행됩니다 static.

그런데 왜?

내 질문은 :

  1. 이 기능이 현재 지원되지 않는 기술적 이유가 있습니까? 아니면 (거대한) 정치적 이유일까요?
  2. 과거에이 기능을 추가하려는 중단 된 시도가 있었습니까?

가장 중요한 점 "userland PHP에서 동적 정적 속성을 어떻게 가질 수 있습니까?" 라는 질문 이 아닙니다 . 즉, __callStatic공유하고 싶은 것을 기반으로 특히 귀여운 구현을 알고 있다면 반드시 그렇게하십시오.

답변:


11

인용 http://marc.info/?l=php-internals&m=121578194822276&w=2

정적 멤버 오버로드가 PHP 5.3에 추가 되었습니까? 정적 메서드 오버로드가 (__callStatic)임을 알았습니다. 두 사람은 서로를 보완하고 이것들을 추가하는 것이 자연스럽게 보입니다. 나는 그들이 "정적 클래스"RFC와 버그 보고서와 별개라는 것을 알았지 만, 5.3에서 이것을 보는 것이 좋을 것입니다. 이 추가와 LSB를 통해 PHP 클래스는 많은 것을 할 수 있습니다! 전의:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

인용 후속 조치 http://marc.info/?l=php-internals&m=121578318524848&w=2

정적 클래스에 대한 RFC가 승인되면 정적 속성 인터셉터는 다음 PHP 메이저 버전의 일부가 될 것입니다 (5.4 또는 6 일 수 있음). 따라서 5.3으로 만들지는 않지만 앞으로는 희망을 가질 것입니다.

정적 클래스 RFC에 연결 :

RFC의 상태는 "작동 중"이지만 2008 년부터는 php.internals 메일 링리스트 또는 EFNet IRC의 # php.pecl에 무엇이 있는지 알아볼 수 있습니다.


고마워, 고든, 평소와 같이 매우 도움이됩니다. ;-) 정적 클래스 RFC는 지원을 제안 보이지만 __getStatic()__setStatic()정적 클래스, 여전히 인스턴스화 할 클래스에 대해이 기능이 유용 할 것입니다. 이 방향으로의 움직임에 대해 알고 있습니까?
David Weinraub

@DavidWeinraub 아뇨, 죄송합니다. Tbh, 정적 메소드와 관련된 것은 신경 쓰지 않습니다. 나는 그들에게 좋은 사용법을 거의 찾지 못하고 나쁜 커플 링과 고통스러운 테스트로 이어집니다.
Gordon

절대적으로 동의하십시오! ;-) 그러나 나를 강요하는 일부 프레임 워크는 모델 레이어에 정적을 사용합니다. __getStatic()기존 코드를 많이 건조시킬 수 있습니다. 감사!
David Weinraub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.