2009-06-22 5 views
15

Kịch bản cụ thể của tôi liên quan đến việc thực hiện một số chuyển đổi văn bản bằng cách sử dụng cụm từ thông dụng trong một phương thức riêng tư. Phương thức riêng gọi preg_replace_callback, nhưng có vẻ như các callback cần phải được công khai trên các đối tượng, vì vậy tôi bị kẹt khỏi thế giới riêng tư và hiển thị chi tiết triển khai khi tôi không muốn.Tôi có thể sử dụng các phương thức cá thể riêng làm gọi lại không?

Tóm lại: Tôi có thể sử dụng phương pháp thể hiện làm cuộc gọi lại mà không mất gói gọn?

Cảm ơn.

Trả lời

21

Vâng, có vẻ như bạn có thể:

<?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; 

Vì vậy, có vẻ như preg_replace_callback(), hoặc cơ chế gọi lại PHP, là nhận thức về phạm vi, trong đó nó được gọi.

Thử nghiệm trên 5.2.8

+0

tính năng hoặc lỗi? nó hoạt động với 5.3rc2/win32. – VolkerK

+2

Whoa, thật đáng kinh ngạc nếu họ xem xét phạm vi. Tôi sẽ chấp nhận một khi tôi dùng thử. –

+0

Xác nhận trên 5.2.9 – jason

1

Bạn có thể tạo một lớp trình trợ giúp riêng biệt để xử lý văn bản và tạo phương thức gọi lại trong lớp đó (nó có thể được công khai ở đó) không? Bạn có thể chuyển tham chiếu đến lớp gốc (đối tượng) nếu bạn cần truy cập vào dữ liệu cá thể cụ thể.

Giao diện nào đến lớp chính của bạn vẫn nhất quán và sạch sẽ, và bạn kéo xử lý chuỗi cụ thể ra khỏi một lớp nó có lẽ không thuộc trong anyway ...

+0

Tôi thích phương pháp này, nhưng nó yêu cầu tất cả mã phải được cấu trúc lại để sử dụng callbacks ... có vẻ là một giải pháp quá lớn. –

-1

Bạn có thể không sử dụng được bảo vệ? Tôi cần phải biết mối quan hệ của hai lớp này có liên quan gì với nhau để rõ ràng hơn, nhưng bạn sẽ có thể mở rộng lớp và sử dụng các phương pháp được bảo vệ mới mà bạn đã kế thừa mà không làm cho chúng công khai.

Hy vọng điều này sẽ hữu ích!

Cheers