PHP 4.3 hakkında sorular orijinal soruyu biliyorum, ama şimdi bir kaç yıl sonra ve ben sadece PHP 5.3 veya daha yüksek bunu yapmak için benim tercih edilen yol savunmak istedik.
PHP 5.3 + şimdi anonymous functions (closures) için destek içerir, bu nedenle (bir kaç uyarılar ile) JavaScript ve Ruby gibi diller gibi bazı standart fonksiyonel programlama tekniklerini kullanabilirsiniz. "Kapatma tarzı" üzerinde call_user_func örneği yeniden Ben daha şık buluyorum ki, bu gibi görünecektir:
$barber = function($type) {
echo "You wanted a $type haircut, no problem\n";
};
$barber('mushroom');
$barber('shave');
Açıkçası, bu örnekte size çok satın almaz - (orijinal söz gibi) diğer işlevler için bu anonim işlevleri geçirdiğinizde güç ve esneklik geliyor. Böylece gibi bir şey yapabilirsiniz:
$barber_cost = function($quantity) {
return $quantity * 15;
};
$candy_shop_cost = function($quantity) {
return $quantity * 4.50; // It's Moonstruck chocolate, ok?
};
function get_cost($cost_fn, $quantity) {
return $cost_fn($quantity);
}
echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n";
echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n";
Bu tabii ki, call_user_func ile yapılabilir, ancak alanları ve üye değişkenler yer almak özellikle bir kez ben, bu sözdizimi çok net bulabilirsiniz.
Bir uyarı: Ben burada tam olarak ne oluyor bilmiyorum itiraf ilk olacak, ama her zaman bir üyesi ya da statik bir değişken bulunan bir kapatma diyoruz, ve muhtemelen diğer bazı durumlarda olamaz. Ama yerel bir değişkene atanmasını çağrılır olmasını sağlayacaktır. Yani, örneğin, bu size bir hata verecektir:
$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);
Ama bu basit bir geçici çözüm sorunu giderir:
$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);