PHP'de geri aramalar nasıl yazılır?
PHP'de geri aramalar nasıl yazılır?
Yanıtlar:
Bu el kitabı "geri çağrı" ve "çağrılabilir" terimlerini birbirinin yerine kullanır, ancak "geri çağrı" geleneksel olarak gelecekteki çağrı için bir işlev veya sınıf yöntemini referans alan bir işlev işaretçisi gibi davranan bir dize veya dizi değeri anlamına gelir . Bu PHP 4 beri fonksiyonel programlama bazı unsurları izin verdi.
$cb1 = 'someGlobalFunction';
$cb2 = ['ClassName', 'someStaticMethod'];
$cb3 = [$object, 'somePublicMethod'];
// this syntax is callable since PHP 5.2.3 but a string containing it
// cannot be called directly
$cb2 = 'ClassName::someStaticMethod';
$cb2(); // fatal error
// legacy syntax for PHP 4
$cb3 = array(&$object, 'somePublicMethod');
Bu, genel olarak çağrılabilir değerleri kullanmanın güvenli bir yoludur:
if (is_callable($cb2)) {
// Autoloading will be invoked to load the class "ClassName" if it's not
// yet defined, and PHP will check that the class has a method
// "someStaticMethod". Note that is_callable() will NOT verify that the
// method can safely be executed in static context.
$returnValue = call_user_func($cb2, $arg1, $arg2);
}
Modern PHP sürümleri, yukarıdaki ilk üç biçimin doğrudan olarak çağrılmasını sağlar $cb(). call_user_funcve call_user_func_arrayyukarıdakilerin tümünü destekleyin.
Bkz. Http://php.net/manual/en/language.types.callable.php
Notlar / Uyarılar:
['Vendor\Package\Foo', 'method']call_user_func referans ile nesne olmayan geçişleri desteklemediğinden, call_user_func_array daha sonraki PHP sürümlerinde geri çağrıyı bir var'a kaydedebilir ve doğrudan sözdizimini kullanabilirsiniz $cb():;__invoke() yöntemle (anonim işlevler dahil) "çağrılabilir" kategorisine girer ve aynı şekilde kullanılabilir, ancak ben şahsen bunları eski "geri arama" terimiyle ilişkilendirmiyorum.create_function()bir global işlev oluşturur ve adını döndürür. Bu bir sarıcıdır eval()ve bunun yerine anonim işlevler kullanılmalıdır.'someGlobalFunction'gerçekten tanımlanmış bir işlev olduğunu belirtmeleri faydalı olacaktır .
PHP 5.3 ile artık bunu yapabilirsiniz:
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
Sonunda bunu yapmanın güzel bir yolu. PHP için harika bir ek, çünkü geri aramalar harika.
Geri arama uygulaması bu şekilde yapılır
// This function uses a callback function.
function doIt($callback)
{
$data = "this is my data";
$callback($data);
}
// This is a sample callback function for doIt().
function myCallback($data)
{
print 'Data is: ' . $data . "\n";
}
// Call doIt() and pass our sample callback function's name.
doIt('myCallback');
Görüntüler: Veriler: bu benim verilerim
call_user_func(). İşlevlerini dinamik olarak aramalarını ve geri arama yapmalarını sağlayan bir sözdizimi olduğunda. Size katılıyorum!
Son zamanlarda bulduğum bir şık hile, tek seferlik kullanım create_function()için anonim / lambda işlevi oluşturmak için PHP'leri kullanmaktır. Sanki PHP fonksiyonları için yararlıdır array_map(), preg_replace_callback()ya da usort()özel işleme kullanan geri aramaları. eval()Kapakların altında olduğu gibi görünüyor , ancak hala PHP'yi kullanmanın güzel bir işlevsel tarzı yolu.
create_function()?
iyi ... ufukta 5.3 ile her şey daha iyi olacak, çünkü 5.3 ile, kapanışlar ve onlarla anonim işlevler alacağız
Aramanızın geçerli olduğunu doğrulamak isteyeceksiniz. Örneğin, belirli bir işlev durumunda, işlevin var olup olmadığını kontrol etmek ve görmek istersiniz:
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
is_callable( $callback )
create_functionbir sınıf içinde benim için çalışmadı. Kullanmak zorunda kaldım call_user_func.
<?php
class Dispatcher {
//Added explicit callback declaration.
var $callback;
public function Dispatcher( $callback ){
$this->callback = $callback;
}
public function asynchronous_method(){
//do asynch stuff, like fwrite...then, fire callback.
if ( isset( $this->callback ) ) {
if (function_exists( $this->callback )) call_user_func( $this->callback, "File done!" );
}
}
}
Ardından, kullanmak için:
<?php
include_once('Dispatcher.php');
$d = new Dispatcher( 'do_callback' );
$d->asynchronous_method();
function do_callback( $data ){
print 'Data is: ' . $data . "\n";
}
?>
[Düzenle] Eksik bir parantez eklendi. Ayrıca, geri arama bildirimi ekledi, ben bu şekilde tercih ederim.
Ben create_function()php her kullandığınızda cringe .
Parametreler koma ile ayrılmış bir dizedir, bir dize içindeki tüm fonksiyon gövdesi ... Argh ... Bence deneseler bile daha çirkin olamazlardı.
Ne yazık ki, adlandırılmış bir işlev oluştururken sorun olmaya değmez tek seçenek budur.
create_function()artık kullanımdan kaldırılmıştır ve kullanılmamalıdır.
PHP ile uyumluluğu bozmayı umursamayanlar < 5.4için, daha temiz bir uygulama yapmak için tip ipucu kullanmanızı öneririm.
function call_with_hello_and_append_world( callable $callback )
{
// No need to check $closure because of the type hint
return $callback( "hello" )."world";
}
function append_space( $string )
{
return $string." ";
}
$output1 = call_with_hello_and_append_world( function( $string ) { return $string." "; } );
var_dump( $output1 ); // string(11) "hello world"
$output2 = call_with_hello_and_append_world( "append_space" );
var_dump( $output2 ); // string(11) "hello world"
$old_lambda = create_function( '$string', 'return $string." ";' );
$output3 = call_with_hello_and_append_world( $old_lambda );
var_dump( $output3 ); // string(11) "hello world"
create_function() PHP 7.2.0'dan itibaren DEPRECATED. Bu işleve güvenmek kesinlikle önerilmez.