簡體   English   中英

PHP 閉包返回多個函數

[英]PHP closure return multiple functions

我試圖在 JS 中提供的 PHP 中實現幾乎相似的東西/關閉屬性。

例如

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 是否允許我們這樣做。

您可以返回一個匿名 class ,它是用$who創建的,然后具有 output 相關消息的方法...

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

決定作為新答案發布,因為它是一個完全不同的解決方案。 這遵循了使用閉包創建私有方法的想法(由 OP 在對我的其他答案的評論中鏈接到 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures )。

這也借鑒了 deceeze 對原始問題的評論,但是將數組轉換為 object 以更准確地將參考反映為 object 而不是數組...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM