PHP 5.3 के लिए परीक्षण किया गया
जैसा कि मैंने यहाँ देखा, बेनामी फंक्शन आपकी मदद कर सकता है:
http://php.net/manual/en/functions.anonymous.php
आपको शायद इसकी क्या आवश्यकता होगी और यह पहले नहीं कहा गया है कि किसी फ़ंक्शन को ऑन-द-फ्लाई-निर्मित फ़ंक्शन के अंदर लपेटे बिना कैसे पास किया जाए । जैसा कि आप बाद में देखेंगे, आपको पैरामीटर के रूप में स्ट्रिंग में लिखे फ़ंक्शन का नाम पास करना होगा, इसकी "कॉलिबिलिटी" जांचें और फिर इसे कॉल करें।
जाँच करने का कार्य:
if( is_callable( $string_function_name ) ){
/*perform the call*/
}
फिर, इसे कॉल करने के लिए, कोड के इस टुकड़े का उपयोग करें (यदि आपको मापदंडों की भी आवश्यकता है, तो उन्हें एक सरणी पर रखें), इसे देखा: http://php.net/manual/en/function.call-user-func.php
call_user_func_array( "string_holding_the_name_of_your_function", $arrayOfParameters );
जैसा कि इस प्रकार है (एक समान, पैरामीटर रहित, तरीके से):
function funToBeCalled(){
print("----------------------i'm here");
}
function wrapCaller($fun){
if( is_callable($fun)){
print("called");
call_user_func($fun);
}else{
print($fun." not called");
}
}
wrapCaller("funToBeCalled");
wrapCaller("cannot call me");
यहाँ एक वर्ग समझा रहा है कि कुछ इसी तरह कैसे करना है:
<?php
class HolderValuesOrFunctionsAsString{
private $functions = array();
private $vars = array();
function __set($name,$data){
if(is_callable($data))
$this->functions[$name] = $data;
else
$this->vars[$name] = $data;
}
function __get($name){
$t = $this->vars[$name];
if(isset($t))
return $t;
else{
$t = $this->$functions[$name];
if( isset($t))
return $t;
}
}
function __call($method,$args=null){
$fun = $this->functions[$method];
if(isset($fun)){
call_user_func_array($fun,$args);
} else {
// error out
print("ERROR: Funciton not found: ". $method);
}
}
}
?>
और उपयोग का एक उदाहरण
<?php
/*create a sample function*/
function sayHello($some = "all"){
?>
<br>hello to <?=$some?><br>
<?php
}
$obj = new HolderValuesOrFunctionsAsString;
/*do the assignement*/
$obj->justPrintSomething = 'sayHello'; /*note that the given
"sayHello" it's a string ! */
/*now call it*/
$obj->justPrintSomething(); /*will print: "hello to all" and
a break-line, for html purpose*/
/*if the string assigned is not denoting a defined method
, it's treat as a simple value*/
$obj->justPrintSomething = 'thisFunctionJustNotExistsLOL';
echo $obj->justPrintSomething; /*what do you expect to print?
just that string*/
/*N.B.: "justPrintSomething" is treated as a variable now!
as the __set 's override specify"*/
/*after the assignement, the what is the function's destiny assigned before ? It still works, because it's held on a different array*/
$obj->justPrintSomething("Jack Sparrow");
/*You can use that "variable", ie "justPrintSomething", in both ways !! so you can call "justPrintSomething" passing itself as a parameter*/
$obj->justPrintSomething( $obj->justPrintSomething );
/*prints: "hello to thisFunctionJustNotExistsLOL" and a break-line*/
/*in fact, "justPrintSomething" it's a name used to identify both
a value (into the dictionary of values) or a function-name
(into the dictionary of functions)*/
?>