2010-04-27 28 views
12

Nó luôn nghe trộm tôi một hàm đệ quy cần phải đặt tên cho chính nó, khi một lớp được thuyết minh có thể sử dụng $this và một phương pháp tĩnh có thể sử dụng self, vvBạn có thể tạo một hàm PHP đệ quy mà không lặp lại tên của nó không?

Có cách nào tương tự để làm điều này trong một hàm đệ quy mà không cần đặt tên nó một lần nữa (chỉ để cắt giảm bảo trì)?

Rõ ràng là tôi có thể sử dụng call_user_func hoặc hằng số __FUNCTION__ nhưng tôi muốn thứ gì đó ít xấu xí hơn.

+2

+1 Thật Grt Câu hỏi ... –

+5

Tại sao là '__FUNCTION__' xấu xí? Có vẻ là một cách rất tốt để đạt được những gì bạn muốn ... –

+0

@Felix bởi vì nó có thể sẽ cần phải được thêm vào 'call_user_func' hoặc với' eval'. Tôi muốn một cái gì đó như 'tự :: ($ var)' – alex

Trả lời

9

Bạn có thể sử dụng variable functions và khai báo biến có tên hàm ở đầu hàm bạn (hoặc bất cứ nơi nào). Không cần call_user_func:

function test($i) { 
    $__name = __FUNCTION__; 
    if($i > 5) { 
     echo $i. "\n"; 
     $__name($i-1); 
    } 
} 

Đừng quên rằng việc sử dụng các thực tên hàm có lẽ là dễ đọc hơn cho những người khác :)
(ít nhất là cung cấp một lời nhận xét tại sao bạn làm điều này)


cập nhật:
Như @Alix đề cập trong bình luận của mình, nó có thể là hữu ích để khai báo $__namestatic. Bằng cách này, giá trị không được gán nhiều lần cho biến.

+0

Quên về những điều đó. Điều đó trông đẹp hơn một chút so với 'call_user_func_array()'. Cảm ơn +1 – alex

+0

+1, đó là gian lận! = P –

+0

Tôi đồng ý với điểm cuối cùng của bạn. Tuy nhiên tôi cảm thấy bạn * nên * có thể đổi tên một chức năng mà không phá vỡ các cuộc gọi đệ quy. Mặc dù tôi nhận ra rằng việc thay đổi tên chức năng sẽ phá vỡ mọi cuộc gọi đến nơi khác. Tôi đoán đây là lý do tại sao bạn nên chọn tên chức năng thực sự tốt ngay từ đầu! – alex

5

Tôi không biết tại sao điều này là xấu xí:

return call_user_func_array(__FUNCTION__, func_get_args()); 

Versus:

return call_user_func_array('someFunction', func_get_args()); 

Bạn vẫn sẽ cần phải sử dụng call_user_func_array() nếu bạn đang tìm kiếm để cắt giảm bảo trì (nếu bạn các hàm có [số lượng/số khác nhau] của đối số).

Khác với số I don't see another way. Ngoài ra một phương pháp tĩnh không thể tự tham chiếu bằng cách sử dụng self::, chỉ cho lớp của nó. Bạn cũng sẽ cần sử dụng hằng số ma thuật __METHOD__ để thực hiện điều đó.

+1

Về 'self ::', đó là ý của tôi. Bạn có thể truy cập các phương thức khác trong cùng một lớp với nó. Tôi chỉ nghĩ rằng nó trông xấu xí so với cái gì đó đơn giản như 'self'. – alex

+0

Cảm ơn câu trả lời của bạn Alix +1 – alex

+0

@alex: Cảm ơn, không sao cả! =) –

0

Đối với những người bạn của những người muốn làm điều này trong một phương pháp tĩnh:

forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc); 

cách này, nếu phương pháp này được đổi tên bạn không phải lo lắng về việc thay đổi tất cả các cuộc gọi đệ quy bên trong nó quá.

2
function anyfunc() { 
    __FUNCTION__(); 
} 

nếu được sử dụng trong lớp học:

protected function anymethod() { 
    $this->{__FUNCTION__}(); 
} 
0
function self(){ 
    return call_user_func_array(debug_backtrace()[1]['function'], func_get_args()); 
} 

function test($i) { 
    if($i) { 
     echo "$i<br>\n"; 
     self($i-1); 
    } 
} 
test(5); 
Các vấn đề liên quan