Bagaimana panggilan balik ditulis dalam PHP?
Bagaimana panggilan balik ditulis dalam PHP?
Jawaban:
Manual menggunakan istilah "callback" dan "callable" secara bergantian, namun, "callback" secara tradisional mengacu pada nilai string atau array yang bertindak seperti penunjuk fungsi , referensi fungsi atau metode kelas untuk doa selanjutnya. Ini telah memungkinkan beberapa elemen pemrograman fungsional sejak PHP 4. Rasa adalah:
$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');
Ini adalah cara yang aman untuk menggunakan nilai-nilai yang bisa dipanggil pada umumnya:
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);
}
Versi PHP modern memungkinkan tiga format pertama di atas untuk dipanggil secara langsung sebagai $cb(). call_user_funcdan call_user_func_arraymendukung semua hal di atas.
Lihat: http://php.net/manual/en/language.types.callable.php
Catatan / Peringatan:
['Vendor\Package\Foo', 'method']call_user_functidak mendukung lewat non-objek dengan referensi, sehingga Anda bisa menggunakan call_user_func_arrayatau, dalam versi PHP kemudian, menyimpan callback untuk var dan menggunakan sintaks langsung: $cb();__invoke()metode (termasuk fungsi anonim) termasuk dalam kategori "bisa dipanggil" dan dapat digunakan dengan cara yang sama, tapi saya pribadi tidak mengaitkan ini dengan istilah "panggilan balik" lama.create_function()menciptakan fungsi global dan mengembalikan namanya. Ini pembungkus untuk eval()dan fungsi anonim harus digunakan sebagai gantinya.'someGlobalFunction'memang merupakan fungsi yang didefinisikan.
Dengan PHP 5.3, Anda sekarang dapat melakukan ini:
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
Akhirnya cara yang bagus untuk melakukannya. Tambahan yang bagus untuk PHP, karena panggilan baliknya mengagumkan.
Implementasi panggilan balik dilakukan seperti itu
// 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');
Menampilkan: Data adalah: ini adalah data saya
call_user_func()Ketika mereka memiliki sintaks yang memungkinkan mereka untuk secara dinamis memanggil fungsi dan membuat panggilan balik. Saya setuju denganmu!
Satu trik bagus yang baru-baru ini saya temukan adalah menggunakan PHP create_function()untuk membuat fungsi anonim / lambda untuk penggunaan sekali pakai. Ini berguna untuk fungsi PHP seperti array_map(), preg_replace_callback()atau usort()bahwa penggunaan callback untuk pengolahan kustom. Ini terlihat seperti itu di eval()bawah selimut, tapi itu masih cara gaya fungsional yang bagus untuk menggunakan PHP.
create_function()?
baik ... dengan 5.3 di cakrawala, semua akan lebih baik, karena dengan 5.3, kita akan mendapatkan penutupan dan dengan mereka fungsi anonim
Anda akan ingin memverifikasi apa pun panggilan Anda valid. Misalnya, dalam hal fungsi tertentu, Anda akan ingin memeriksa dan melihat apakah fungsi tersebut ada:
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
is_callable( $callback )
create_functiontidak bekerja untuk saya di dalam kelas. Saya harus menggunakan 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!" );
}
}
}
Lalu, untuk menggunakan:
<?php
include_once('Dispatcher.php');
$d = new Dispatcher( 'do_callback' );
$d->asynchronous_method();
function do_callback( $data ){
print 'Data is: ' . $data . "\n";
}
?>
[Sunting] Menambahkan tanda kurung yang hilang. Juga, menambahkan deklarasi panggilan balik, saya lebih suka seperti itu.
Saya merasa ngeri setiap kali saya menggunakan create_function()php.
Parameter adalah string yang dipisahkan koma, seluruh fungsi tubuh dalam sebuah string ... Argh ... Saya pikir mereka tidak bisa membuatnya lebih buruk bahkan jika mereka mencoba.
Sayangnya, itu adalah satu-satunya pilihan ketika membuat fungsi bernama tidak sebanding dengan masalahnya.
create_function()sekarang sudah usang dan tidak boleh digunakan.
Bagi mereka yang tidak peduli tentang melanggar kompatibilitas dengan PHP < 5.4, saya sarankan menggunakan tipe hinting untuk membuat implementasi yang lebih bersih.
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() telah DITANGGUHKAN pada PHP 7.2.0. Mengandalkan fungsi ini sangat tidak dianjurkan.