PHP闭包return多个函数
PHP closure return multiple functions
我正在尝试在 PHP 中实现几乎相似的 things/properties 闭包,这在 JS 中可用。
例如
function createGreeter($who) {
return function(){
function hello() use ($who) {
echo "Hi $who";
}
function bye() use($who){
echo "Bye $who";
}
};
}
我知道我的语法不正确,这是我正在努力实现的目标。
到目前为止我所做的是。
function createGreeter() {
$hi = "hi how are you.";
$bye = "bye wish you luck.";
return function($operation) use ($hi, $bye){
if ($operation == "a") return $hi;
elseif ($operation == "b") return $bye;
};
}
$op = createGreeter();
echo $op("a"); #prints hi how are you.
echo $op("b"); #prints bye wish you luck.
请看 PHP 是否允许我们这样做。
您可以 return 一个匿名的 class,它是使用 $who
创建的,然后具有输出相关消息的方法...
function createGreeter($who) {
return new class($who){
private $who;
public function __construct( $who ) {
$this->who = $who;
}
function hello() {
echo "Hi {$this->who}";
}
function bye(){
echo "Bye {$this->who}";
}
};
}
$op = createGreeter("me");
echo $op->hello(); // Hi me
echo $op->bye(); // Bye me
决定 post 作为一个新的答案,因为它是一个完全不同的解决方案。这遵循使用闭包创建私有方法的想法(正如 OP 在评论我的其他答案时所链接的那样 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures)。
这也借鉴了 deceeze 对原始问题的评论,但是将数组转换为对象以更准确地反映引用是对象而不是数组...
function createGreeter($who) {
return (object)
[ "Hello" => function() use ($who) {
echo "Hello {$who}";
},
"Goodbye" => function() use ($who) {
echo "Goodbye {$who}";
}];
}
$op = createGreeter("me");
($op->Hello)();
($op->Goodbye)();
方法周围的 ()
是必需的,因为它是闭包而不是实际方法。
这给...
Hello meGoodbye me
我正在尝试在 PHP 中实现几乎相似的 things/properties 闭包,这在 JS 中可用。
例如
function createGreeter($who) {
return function(){
function hello() use ($who) {
echo "Hi $who";
}
function bye() use($who){
echo "Bye $who";
}
};
}
我知道我的语法不正确,这是我正在努力实现的目标。
到目前为止我所做的是。
function createGreeter() {
$hi = "hi how are you.";
$bye = "bye wish you luck.";
return function($operation) use ($hi, $bye){
if ($operation == "a") return $hi;
elseif ($operation == "b") return $bye;
};
}
$op = createGreeter();
echo $op("a"); #prints hi how are you.
echo $op("b"); #prints bye wish you luck.
请看 PHP 是否允许我们这样做。
您可以 return 一个匿名的 class,它是使用 $who
创建的,然后具有输出相关消息的方法...
function createGreeter($who) {
return new class($who){
private $who;
public function __construct( $who ) {
$this->who = $who;
}
function hello() {
echo "Hi {$this->who}";
}
function bye(){
echo "Bye {$this->who}";
}
};
}
$op = createGreeter("me");
echo $op->hello(); // Hi me
echo $op->bye(); // Bye me
决定 post 作为一个新的答案,因为它是一个完全不同的解决方案。这遵循使用闭包创建私有方法的想法(正如 OP 在评论我的其他答案时所链接的那样 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures)。
这也借鉴了 deceeze 对原始问题的评论,但是将数组转换为对象以更准确地反映引用是对象而不是数组...
function createGreeter($who) {
return (object)
[ "Hello" => function() use ($who) {
echo "Hello {$who}";
},
"Goodbye" => function() use ($who) {
echo "Goodbye {$who}";
}];
}
$op = createGreeter("me");
($op->Hello)();
($op->Goodbye)();
方法周围的 ()
是必需的,因为它是闭包而不是实际方法。
这给...
Hello meGoodbye me