是否可以在PHP中模仿Javascript闭包?

时间:2018-07-08 20:00:33

标签: javascript php closures

我现在正在学习PHP,我想看看它是否保留对变量的访问,就像Javascript在“闭包”中一样。

我尝试了以下代码:

  function createGreeting($lang){

   $greeting= "";
   if($lang === 'english'){
      $greeting = 'Hello';
   }elseif($lang === 'spanish'){
      $greeting = 'Holla';
  }   

  return function($name){

      return $greeting.", ".$name;
  };
}

$greetFunction = createGreeting('english');

echo $greetFunction('John');

如您所见,createGreeting()接受一种语言,并返回一个函数,该函数可以访问在主函数中定义的“ greeting”变量。这行不通。我收到一条错误消息,说未定义问候语。在Javascript中,这当然可以工作,这要归功于闭包。

用PHP处理该问题的常规方法是什么?我别无选择,只能在返回的函数中声明greeting变量吗?

2 个答案:

答案 0 :(得分:4)

是可以的,use可以使外部作用域的指定变量在闭包内部可用

function createGreeting($lang){

    $greeting= "";
    if($lang === 'english'){
        $greeting = 'Hello';
    }elseif($lang === 'spanish'){
        $greeting = 'Holla';
    }   

    return function($name) use ($greeting){
        return $greeting.", ".$name;
    };
}

$greetFunction = createGreeting('english');
echo $greetFunction('John');

答案 1 :(得分:2)

Rainmx93的答案对于产生闭包非常有用,但让我给出一种面向对象的方法。

class Chat {

    protected $lang;

    function __construct($lang) {
        $this->lang = $lang;
    }

    function hello() {
        switch($this->lang) {
            case 'english':
                return 'Hello';
            case 'espanol':
                return 'Hola';
        }
    }

    function greet($name) {
        return $this->hello() . ', ' . $name;
    }

}

$chat = new Chat('english')
echo $chat->greet('John');

当然,在通常的情况下,您不会为单个翻译使用名为“ hello”的方法。您会将翻译存储在语言文件,数据库或数组中。

这种方法背后的真正力量,除了更具可读性之外,还可以是一堆除了问候之外还可以与用户聊天的方法。