Đã thử nghiệm cho PHP 5.3
Như tôi thấy ở đây, Chức năng ẩn danh có thể giúp bạn:
http://php.net/manual/en/functions.anonymous.php
Những gì bạn có thể cần và nó chưa được nói trước đó là cách truyền một hàm mà không cần gói nó bên trong một hàm được tạo nhanh chóng . Như bạn sẽ thấy sau này, bạn sẽ cần chuyển tên của hàm được viết trong một chuỗi làm tham số, kiểm tra "khả năng gọi" của nó và sau đó gọi nó.
Chức năng kiểm tra:
if( is_callable( $string_function_name ) ){
/*perform the call*/
}
Sau đó, để gọi nó, hãy sử dụng đoạn mã này (nếu bạn cũng cần tham số, hãy đặt chúng vào một mảng), xem tại: http://php.net/manual/en/ Chức năng.call-user-func.php
call_user_func_array( "string_holding_the_name_of_your_function", $arrayOfParameters );
như sau (theo cách tương tự, không tham số):
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");
Đây là một lớp học giải thích cách làm điều gì đó tương tự:
<?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);
}
}
}
?>
và một ví dụ về cách sử dụng
<?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)*/
?>