PHP закрытие вернуть несколько функций - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь добиться почти похожих вещей / свойств замыкания в 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 позволяет нам сделать это.

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Вы можете вернуть анонимный класс, который создается с помощью $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
3 голосов
/ 28 апреля 2020

Решили опубликовать как новый ответ, так как это совершенно другое решение. Это следует за идеей создания приватных методов с использованием замыканий (как указано в комментарии к моему другому ответу OP - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Emulating_private_methods_with_closures).

Это также д-р aws в комментариях Десиза к исходный вопрос, но приведение массива к объекту для более точного отражения ссылки как объекта, а не массива это замыкание, а не фактический метод.

Это дает ...

Hello meGoodbye me
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...