2010-03-27 5 views
2

debug_backtrace() 이외의 호출자 함수를 가져 오는 방법이 있습니까?PHP : 친구 클래스 및 ungreedy 호출자 함수/클래스

친구 또는 내부과 같은 범위를 시뮬레이트하는 덜 탐욕스러운 방법을 찾고 있습니다.

의 나는 내가 (IMHO) 너무 욕심 debug_backtrace()을 사용하고, 지금까지 클래스 A와 클래스 B를

있다고 가정 해 봅시다. 그것은 당신이 하나 개의 특정 클래스로 제한하려면 OK, 그러나이 전 300 개 수업을, 나는 25로 제한하려는 가정 해 봅시다 수

<?php 

    class A 
    { 
     public function __construct(B $callerObj) {} 
    } 

    class B 
    { 
     public function someMethod() 
     { 
      $obj = new A($this); 
     } 
    } 
?> 

:

나는 이런 식으로 뭔가 생각 그들?

public function __construct(CallerInterface $callerObj)

을하지만 여전히 추한 코드입니다 :

한 가지 방법은 집계 인터페이스를 사용할 수 있습니다.

클래스로 그 트릭을 사용할 수 없습니다.

더 좋은 아이디어가 있습니까?

+1

PHP 부분과 관련하여 질문에 대답 할 수 없지만 인터페이스를 사용하는 것이 매우 견고하고 견고한 솔루션이라는 점을 언급하고 싶습니다. 그것에 대해 아무것도 못 생겼어. 적어도, 당신이 제공하는 예제에서는 아닙니다. – Henri

+0

@Henri : 내 포스트에서 말했듯이 "게다가 * 정적 클래스 *로 그 트릭을 사용할 수 없습니다." – avetisk

답변

2

debug_backtrace(FALSE)으로 전화를 걸면 개체 인덱스가 채워지지 않습니다. 이렇게하면 속도는 빨라지 겠지만, 일반적으로 debug_backtrace는 프로덕션 코드에서 피해야합니다. 단, 앱이 속도에 문제가 없거나 오류 처리를 위해 소프트웨어 도구가 아닌 경우는 예외입니다.

  • 이 (가) 호출자에서 사용할 수있는 호출자와 선택된 클래스에 개인 보호 특성
  • 외부 액세스에 대한 암시 적 참조가에 내가 이해에서

    , 당신은 할 수 있습니다.

두 가지 모두 PHP에 존재하지 않습니다 (및 캡슐화 imho 나누기). 토론의 경우,

+1

두 링크 모두에게 감사드립니다. 나는 PHP 개발자 팀 *이 "친구 선언에 반하는 것"*을 발견했습니다. http://bugs.php.net/bug.php?id=34044 정말 나 빠졌습니다. 어쨌든, 조언 주셔서 감사합니다! – avetisk

6

PHP 정말 당신이 처리의 우아한 방법을 제공하지 않습니다 참조하시기 바랍니다. 언어가 폭넓게 시작된다는 의미가 없으면 디자인 기술과 요구가 도구의 한계를 초과했을 가능성이 있음을 강력하게 제안 할 것입니다. PHP는 pseudo-OOP 기능을 많이 사용하는 경량 스크립팅 언어이지만 핵심은 우아한 엔터프라이즈 아키텍처를 위해 설계된 것이 아닙니다.

+0

+1 미묘하지만 매우 사실! – Henri

+1

그런 다음 우아한 엔터프라이즈 아키텍처에 적합한 언어가 무엇인지 설명하십시오. 또한 Tiobe 지수에서 PHP가 3 위를 차지한 이유와 세계 최대의 소셜 네트워크가 PHP를 실행하는 이유를 설명해주십시오. 또한 callee에서 암시 적으로 외부 범위에 액세스 할 수있을 때 우아한 경우 JavaScript 1.1에서 argument.caller가 사용되지 않는 이유를 설명하십시오. – Gordon

+3

인기도는 디자인 품질과 관련이 매우 낮습니다. 위에서 말했듯이, 나의 의도는 언어 전쟁을 피하는 것이었고, 정확히 그 이유에 대해 다른 플랫폼 제안을하는 것을 명시 적으로 피했다. 언어 적 장점에 대해 토론하고 싶다면 오프라인에서도 할 수 있지만, 그 논쟁을위한 장소는 아닙니다. –