我现在正在学习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()接受一种语言,并返回一个函数,该函数可以访问main function中定义的"greeting“变量。这不管用。我得到一个错误,说没有定义问候语。在Javascript中,这当然会起作用,这要归功于闭包。
在PHP中,处理这个问题的传统方法是什么?我是不是别无选择,只能在返回的函数中声明greeting变量?
发布于 2018-07-09 04:03:37
是的,使用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');
发布于 2018-07-09 04:38:09
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‘的方法用于单个翻译。您已经将翻译存储在语言文件、数据库或数组中。
这种方法背后的真正力量,除了可读性更强之外,还可以有一堆额外的方法来与用户聊天,而不仅仅是问候。
https://stackoverflow.com/questions/51235549
复制相似问题