2009-06-22 4 views
15

내 개인적인 방법으로 정규식을 사용하여 텍스트 변환을 수행하는 경우가 있습니다. private 메소드는 preg_replace_callback을 호출하지만, 콜백이 객체에 공개되어야하는 것처럼 보입니다. 그래서 개인 세계에서 벗어나 구현 정보를 공개하지 않을 수 있습니다.개인 인스턴스 메서드를 콜백으로 사용할 수 있습니까?

요약하면 캡슐화를 잃지 않고 콜백으로 인스턴스 메서드를 사용할 수 있습니까?

감사합니다.

답변

21

그래, 당신이 할 수있는 것 같다.

나는이 방법을 좋아

+0

기능 또는 버그? 그것은 5.3rc2/win32와 함께 작동합니다. – VolkerK

+2

와우, 범위를 고려한 경우에는 너무 놀라워. 한번 시도해 보면 받아 들일 것입니다. –

+0

5.2.9에 확인 됨 – jason

1

텍스트 처리를 위해 별도의 도우미 클래스를 만들고 해당 클래스 내에서 콜백 메서드를 만들 수 있습니까 (public 일 수 있습니까)? 특정 인스턴스 데이터에 액세스해야하는 경우 원본 클래스 (객체)에 대한 참조를 전달할 수 있습니다.

메인 클래스에 공용 인터페이스가 일치하고 깨끗한 남아 있고, 당신은 아마 어쨌든에 속하지 않는 클래스에서 특정 문자열 처리를 당겨 ...

+0

5.2.8에서 테스트하지만, 모든 코드가 ... 너무 큰 해결 방법을 보인다 콜백의 사용을 리팩토링 할 필요 것입니다. –

-1

당신이하지 보호 할 수 있습니까? 이 두 클래스의 관계가 서로 관련되어 있는지 더 자세히 알 필요가 있지만 클래스를 확장하고 상속받은 새 보호 된 메소드를 공개하지 않고 사용할 수 있어야합니다.

희망이 도움이됩니다.

<?php 

//this works 
class a { 
    private function replaceCallback($m) { return 'replaced'; } 

    public function test() { 
     $str = " test test "; 
     $result = preg_replace_callback('/test/', array($this, 'replaceCallback'), $str); 
     echo $result; 
    } 
} 

$a = new a(); 
$a->test(); 


//this doesn't work 
$result = preg_replace_callback('/test/', array(new a(), 'replaceCallback'), ' test test ');  
echo $result; 

는 그래서 그 preg_replace_callback() 보인다, 또는 PHP의 콜백 메커니즘은, 그것이 호출되었던 범위의 인식 :

건배

관련 문제