什么叫可变。在程序世界中,可变的当然是变量。常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能批改的。然而变量却不同,它们能够批改。那么可变变量和可变函数又是什么意思呢?很显著,就是用另一个变量来定义他们,这个变量是可变的呀!
可变变量
$a = 'hello';
$$a = 'world';
echo $a, ' ', $hello;
咦,咱们没有定义 \$hello 这个变量呀。嗯,从外表上看咱们的确没有定义这个变量,但请留神这个 $$ 符号。$ 符号的意思就是定义变量,当咱们在一个 $ 符号前面跟上一个曾经定义的变量名,那么这个变量的内容就成为了新的变量名。也就是说,$a 的内容 hello 成为了一个新的变量名叫 $hello,而后给它赋值为 world。是不是感觉不太好了解,也不便于咱们查看代码,这个问题咱们最初再说。
当然,以下的用法要留神:
$a = 1;
$$a = 2;
echo $1; // Parse error: syntax error, unexpected '1'
echo ${1}; // ok
$a = ['b', 'c', 'd'];
$$a = 'f';
echo $b, $c, $d;
- 数字类型不是非法的变量名,不能作为可变变量被定义
- 然而利用 {},是能够输入的,{} 会获取 {} 外部的值并作为一个变量来解析,这里的 {1} 咱们利用可变变量赋值成为了一个变量,间接输入是十分的,但放在 {1} 中就成为了一个可解析的变量名,咱们能够简略的了解为 {1} 转换成了 $’1’,成为了一个正式的变量名
- 数组当然是不行啦
- 它们这样写都是不会报错的
应用对象就不行了,间接就会报错了,对象是不能进行可变变量的操作的。
class A {}
class B extends A {}
$a = new A();
$$a = new B(); // Catchable fatal error: Object of class A could not be converted to string
可变函数
可变函数其实也大同小异,当咱们在一个变量的前面加上 () 时,PHP 就会尝试将这个变量当做函数来解析。
function testA()
{echo "testA";}
$a = 'testA';
$a(); // testA
可变变量是将一个字符串转换成了一个变量名,而可变函数则是将一个字符串当做函数名来调用。比方类中的办法,咱们能够这样来调用:
class C
{public function testA()
{echo "C:testA";}
public function testB()
{echo "C:testB";}
public function testC()
{echo "C:testC";}
}
$funcs = ['testA', 'testB', 'testC'];
$c = new C();
foreach ($funcs as $func) {$c->$func();
}
可变函数的这种个性和另外两个零碎函数的关系十分严密,它们是:call_user_func()和 call_user_func_array(),Laravel 中服务容器的外围实现就是应用了 call_user_func_array()来实现依赖注入与管制反转的,这个等咱们未来学习到的时候再说。
总结
看似很美妙很灵便的可变变量与可变函数在咱们理论的开发中却很少应用。究其原因当然是可读性不好,代码不仅是写给机器的,也是写给人看的,团队中人员的程度不齐的话过多的应用这两种个性会产生十分多的凌乱状况。然而,很多框架代码中会应用这些个性,所以,这也是咱们向更高层次迈进所必须要把握的货色。不论怎么样,学就是了,能在业务场合中应用可变变量或者函数大大节约代码量写出粗劣易读的代码更能彰显咱们的技术实力。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E7%9A%84%E5%8F%AF%E5%8F%98%E5%8F%98%E9%87%8F%E4%B8%8E%E5%8F%AF%E5%8F%98%E5%87%BD%E6%95%B0.php
参考链接:
https://www.php.net/manual/zh/language.variables.variable.php
https://www.php.net/manual/zh/functions.variable-functions.php
各自媒体平台均可搜寻【硬核项目经理】