2012-07-16 2 views
0

좋아, 아마도 이것이 가능하지는 않지만, 시도해 볼게. 어쩌면 내 지식이 그렇게 좋지 않을 수도 있습니다. 제발 downvote하지 마세요, 이것은 단지 호기심에 대한 그리고 아마도 어쩌면 열악한 물건 디자인 때문일 수 있습니다.PHP에서 상속없는 인스턴스 메소드를 재정의 하시겠습니까?

A에 대한 클래스 정의가 가정 :

class A 
{ 
    public function build() 
    { 
     $data = $this->fetchData(); 
     ... 
    } 

    public function fetchData() 
    { 
     // Database eavy query 
     return $this->repository->fetchDataForCharting(); 
    } 
} 

그리고, 좋은 괜찮은 OO 디자인을 사용하지 않고, 당신은 클래스 B 다른 몇 가지 다른 일을 위해, 저장소에서 fetchDataForCharting를 사용하려고하는 생성 계산 :

class B 
{ 
    public $data; 

    public function getMonthlyLimit() 
    { 
     // Database eavy query 
     $data = $this->getData(); 
    } 

    public function getData() 
    { 
     return isset($this->data) ? $this->data : 
      $this->repository->fetchDataForCharting(); 
    } 
} 

은 때때로 당신은 때때로 당신은, 때때로 모두 만 B 필요 만 A해야합니다. 런타임에 fetchData을 무시할 수있는 방법이 있습니까? 내가 jQuery를에 $.extend() 같은가 someting 의미 :

$b = new B(); 
$b->getMonthlyLimit(); // $b->data filled 

$a = new A(); 

// Override fetchData 
$a = extend($a, 'fetchData', function() use($b) { return $b->data; }); 

$a->build(); // Just 1 query 

답변

1

가 클래스 메소드를 추가/교체/수정 할 적절한 방법이 없습니다.

확장자는 runkit_method_redefine()runkit_method_add()이지만 모두 실험적이며 추한 것입니다 (익명 함수와 같은 Closure 객체가 아니라 코드 문자열을 사용합니다).

0

당신이 무엇을하려고 나에게 정말 명확하지 않다,하지만 PHP 당신이 CALSS의 B 가질 수 있도록 클래스 B 선언을 작성하여 클래스 A를 확장 :

Class B extends Class A { 
    ... 
} 

당신 수있는 오버라이드를 이 도움이

public function fetchData { 
    // do something different than in class A 
} 

또는

public function fetchData { 
    // execute the Class A functionality first 
    parent::fetchData(); 

    // now do something in addition to what is in Class A functionality 
} 

희망 같은 클래스 B에서 fetchData 기능.

+0

물론 알고 있습니다. 그러나 A와 B를 상속의 일부가 아닌 다른 의미를 가진 별개의 대상으로 생각하십시오 ... – gremo

0

짧은 대답은 아니오입니다.

class A 
{ 
    public function __construct() 
    { 
    $this->bar = function() 
    { 
    }; 
    } 

    public function foo() 
    { 
    $bar = $this->bar; 
    $bar(); 
    } 
} 

$a = new A(); 
$a->bar = function() 
{ 
    // override 
}; 
$a->foo(); 

$this 지원을 위해 PHP 5.4이 필요 :

당신은 당신이 묻는 정확히 무엇을 얻을 수있는 가장 가까운 뭔가 같다. 그러나 "실제"객체 지향 프로그래밍이 없기 때문에 사람들은 JavaScript에서 그런 종류의 일을 수행한다는 것을 명심하십시오. JavaScript, Ruby, Python 등을 에뮬레이션하려고해서는 안됩니다.

명확하게 : PHP에서 상속 또는 구성 또는 종속성 삽입은 아마도 사용자가하려는 일에 착수하는 적절한 방법 일 것입니다. (위의 해킹은 분명히 이 아니며, 수행해야하는 작업은입니다.)

관련 문제