首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有可能在PHP中模仿Javascript闭包?

有没有可能在PHP中模仿Javascript闭包?
EN

Stack Overflow用户
提问于 2018-07-09 04:00:33
回答 2查看 89关注 0票数 0

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

我试过这段代码:

代码语言: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()接受一种语言,并返回一个函数,该函数可以访问main function中定义的"greeting“变量。这不管用。我得到一个错误,说没有定义问候语。在Javascript中,这当然会起作用,这要归功于闭包。

在PHP中,处理这个问题的传统方法是什么?我是不是别无选择,只能在返回的函数中声明greeting变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 04:03:37

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

代码语言:javascript
复制
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');
票数 4
EN

Stack Overflow用户

发布于 2018-07-09 04:38:09

Rainmx93的答案很适合生成闭包,但让我给出一个面向对象的方法。

代码语言:javascript
复制
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‘的方法用于单个翻译。您已经将翻译存储在语言文件、数据库或数组中。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51235549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档