PHP में कॉलबैक कैसे लिखे जाते हैं?
PHP में कॉलबैक कैसे लिखे जाते हैं?
जवाबों:
मैनुअल "कॉलबैक" और "कॉल करने योग्य" शब्दों का परस्पर उपयोग करता है, हालांकि, "कॉलबैक" पारंपरिक रूप से एक स्ट्रिंग या सरणी मान को संदर्भित करता है जो भविष्य के आह्वान के लिए एक फ़ंक्शन या वर्ग विधि का संदर्भ देते हुए फ़ंक्शन पॉइंटर की तरह काम करता है । यह PHP 4. के बाद से कार्यात्मक प्रोग्रामिंग के कुछ तत्वों की अनुमति दी है: जायके हैं:
$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');
यह सामान्य रूप से कॉल करने योग्य मूल्यों का उपयोग करने का एक सुरक्षित तरीका है:
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);
}
आधुनिक PHP संस्करण ऊपर के पहले तीन प्रारूपों को सीधे रूप में लागू करने की अनुमति देते हैं $cb()। call_user_funcऔर call_user_func_arrayउपरोक्त सभी का समर्थन करते हैं।
देखें: http://php.net/manual/en/language.types.callable.php
नोट / चेतावनियां:
['Vendor\Package\Foo', 'method']call_user_funcसंदर्भ द्वारा गैर-ऑब्जेक्ट पास करने का समर्थन नहीं करता है, इसलिए आप या तो उपयोग कर सकते हैं call_user_func_arrayया बाद के PHP संस्करणों में, कॉलबैक को एक संस्करण में सहेज सकते हैं और प्रत्यक्ष सिंटैक्स का उपयोग कर सकते हैं $cb():;__invoke()विधि (अनाम कार्यों सहित) की वस्तुएं "कॉल करने योग्य" श्रेणी के अंतर्गत आती हैं और उनका उपयोग उसी तरह से किया जा सकता है, लेकिन मैं व्यक्तिगत रूप से इन्हें "कॉलबैक" शब्द के साथ नहीं जोड़ता हूं।create_function()एक वैश्विक समारोह बनाती है और अपना नाम वापस करती है। इसके लिए एक रैपर है eval()और इसके बजाय अनाम कार्यों का उपयोग किया जाना चाहिए।'someGlobalFunction'वास्तव में एक परिभाषित फ़ंक्शन है।
PHP 5.3 के साथ, अब आप ऐसा कर सकते हैं:
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
अंत में यह करने के लिए एक अच्छा तरीका है। PHP के लिए एक बढ़िया अतिरिक्त, क्योंकि कॉलबैक बहुत बढ़िया हैं।
एक कॉलबैक का कार्यान्वयन इस तरह किया जाता है
// 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');
प्रदर्शित करता है: डेटा है: यह मेरा डेटा है
call_user_func()जब लोग एक वाक्यविन्यास का उपयोग करना चाहते हैं जो उन्हें गतिशील रूप से कॉल फ़ंक्शन करने और कॉलबैक करने में सक्षम बनाता है। मैं आपसे सहमत हुँ!
एक निफ्टी ट्रिक जो मैंने हाल ही में पाया है create_function(), एक-शॉट के उपयोग के लिए एक अनाम / लैम्ब्डा फ़ंक्शन बनाने के लिए PHP का उपयोग करना है। ऐसा लगता है कि पीएचपी कार्यों के लिए उपयोगी है array_map(), preg_replace_callback()या usort()कस्टम प्रसंस्करण के लिए कि उपयोग कॉलबैक। यह बहुत अच्छा लग रहा है जैसे कि यह eval()कवर के नीचे है, लेकिन यह अभी भी PHP का उपयोग करने के लिए एक अच्छा कार्यात्मक शैली है।
create_function()?
अच्छी तरह से ... क्षितिज पर 5.3 के साथ, सभी बेहतर होंगे, क्योंकि 5.3 के साथ, हम बंद हो जाएंगे और उनके साथ अनाम कार्य करेंगे
आप अपनी कॉलिंग जो भी मान्य है उसे सत्यापित करना चाहेंगे। उदाहरण के लिए, किसी विशिष्ट फ़ंक्शन के मामले में, आप यह देखना और देखना चाहेंगे कि फ़ंक्शन मौजूद है या नहीं:
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
is_callable( $callback )
create_functionएक कक्षा के अंदर मेरे लिए काम नहीं किया। मुझे इस्तेमाल करना था 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!" );
}
}
}
फिर, उपयोग करने के लिए:
<?php
include_once('Dispatcher.php');
$d = new Dispatcher( 'do_callback' );
$d->asynchronous_method();
function do_callback( $data ){
print 'Data is: ' . $data . "\n";
}
?>
[संपादित करें] एक लापता कोष्ठक जोड़ा गया। इसके अलावा, कॉलबैक घोषणा को जोड़ा, मैं इसे इस तरह से पसंद करता हूं।
मैं हर बार जब मैं create_function()php में उपयोग करता हूँ cringe ।
पैरामीटर एक कोमा से अलग किया गया स्ट्रिंग है, एक स्ट्रिंग में पूरे फ़ंक्शन बॉडी ... अर्घ ... मुझे लगता है कि वे कोशिश करने पर भी इसे बदसूरत नहीं बना सकते थे।
दुर्भाग्य से, यह एकमात्र विकल्प है जब नामित फ़ंक्शन का निर्माण करना परेशानी के लायक नहीं है।
create_function()अब वंचित है और इसका उपयोग नहीं किया जाना चाहिए।
जो लोग PHP के साथ संगतता को तोड़ने के बारे में परवाह नहीं करते हैं < 5.4, मैं उन्हें एक क्लीनर कार्यान्वयन बनाने के लिए टाइपिंग का उपयोग करने का सुझाव दूंगा।
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 के रूप में परिभाषित किया गया है। इस समारोह पर भरोसा करना बहुत हतोत्साहित करता है।