# PHP5和PHP7之间关于取数组元素作动态函数名的差异
## 1. 动态函数名
动态函数名是指函数名不是在定义时写死,而是在程序运行时根据变量或表达式来动态生成。
在一些特定的场景下,动态函数名可以帮助我们编写更灵活的代码,提高代码的复用性和可扩展性。
## 2. 取数组元素作动态函数名
在PHP中,我们可以把一个数组的元素取出来作为函数名来调用对应的函数。比如:
```
$func = $arr['func_name'];
$func();
```
这段代码相当于调用了 `func()` 函数,但是函数名是动态生成的。
这个特性常用于回调函数和工厂模式等场景。
## 3. PHP5和PHP7的差异
在PHP5中,当动态函数名是从一个数组元素中取出时,函数名被解析为一个常量。如果这个常量不存在,那么PHP将会把它作为字符串处理。
举个例子:
```
$arr = ['func_name' => 'test'];
$func = $arr['func_name'];
$func();
```
这段代码会调用 `test()` 函数。
但是我们如果在 `$arr` 数组中不存在 `func_name` 这个键值
```
$arr = ['foo' => 'test'];
$func = $arr['func_name'];
$func();
```
那么我们会得到一个致命错误:
```
Fatal error: Function name must be a string in ...
```
也就是说,当动态函数名从数组中取出时,我们必须要保证这个数组元素是字符串类型,否则会出现错误。
但在PHP7中,函数名从数组中取出时会被视为表达式而不是常量,这样我们就可以使用任意表达式来作为函数名了,比如:
```
function test() {
echo "hello";
}
$arr = [
'func_name' => 'test',
'prefix' => 't',
];
$func = $arr['prefix'].'est';
$func();
```
这段代码会输出 "hello"。
注意,前缀 `t` 和函数名 `est` 是拼接而成的表达式。
## 4. 总结
在PHP5中,从数组中取出函数名作为动态函数名时需要特别注意,必须保证数组元素是字符串类型。而在PHP7中,函数名从数组中取出时会被视为表达式,这样我们就可以使用任意表达式来作为函数名,代码更灵活。
以上是PHP5和PHP7之间关于取数组元素作动态函数名的差异的详细介绍,希望对大家有所帮助。