我现在正在学习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变量吗?
答案 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”的方法。您会将翻译存储在语言文件,数据库或数组中。
这种方法背后的真正力量,除了更具可读性之外,还可以是一堆除了问候之外还可以与用户聊天的方法。