【问题标题】:PHP closure return multiple functionsPHP闭包返回多个函数
【发布时间】:2020-08-12 01:50:16
【问题描述】:

我正在尝试在 PHP 中实现几乎类似的东西/闭包属性,这在 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 ['hello' => function () use ($who) { ... }, ...]…?
  • @B001ᛦ 只是出于好奇,我已经知道 OOPS 可以很容易地做到这一点,但是这一次,我只是想用面向过程的没关系。

标签: php php-closures


【解决方案1】:

您可以返回一个使用$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

【讨论】:

  • 我知道这种方法,我的意思是 OOPS 我们可以轻松做到。但是我们也可以通过程序的方式来做吗?
  • 你的意思是你想做类似this的事情吗?
  • 看看这个this
【解决方案2】:

决定作为新答案发布,因为它是一个完全不同的解决方案。这遵循了使用闭包创建私有方法的想法(由 OP 在对我的其他答案的评论中链接到 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures)。

这也借鉴了 deceeze 在原始问题上的 cmets,但是将数组转换为对象以更接近地将引用反映为对象而不是数组...

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

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多