玄学-assert
Jun 1, 2018 09:54 · 83 words · 1 minute read
前
emmmmmm,本来只是一个一句话的函数,但是因为版本的问题,折腾了好久,所以记录一下
动态函数执行
在php中,允许动态函数执行。当时看到这里有点懵,什么是动态函数执行?
示例
$a = "ass";
function ass(){
echo "sdas";
}
ass();
echo "<br>";
$a();
这两种写法都执行了assert()函数,第二种调用方法就是所谓动态函数执行。
assert函数
### php5版本 官方文档
bool assert ( mixed $assertion [, string $description ] )
如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。
assertion 是字符串的优势是当禁用断言时它的开销会更小,并且在断言失败时消息会包含 assertion 表达式。 这意味着如果你传入了 boolean 的条件作为 assertion,这个条件将不会显示为断言函数的参数;在调用你定义的 assert_options() 处理函数时,条件会转换为字符串,而布尔值 FALSE 会被转换成空字符串
由文档可知,我们可以这样写一句话
<?php assert($_POST[a]);?>
在php5.4.16版本下,测试没有问题。
继续测试使用动态调用
<?php
$a = "assert";
$a($_POST[a]);
?>
在php5.4.16版本下,测试没有问题。
php7版本
php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
以上两种调用方法在php7.0.29版本之前都测试成功,7.0.29版本之后动态调用的方法无法成功。
在7.0.29版本之后发现的奇怪的一点
<?php
//?a=phpinfo()
$a = 'assert';
$a($_POST['a']);
?>
//phpinfo()无法执行成功
<?php
$a = 'assert';
$a(phpinfo());
?>
//成功执行phpinfo()
真的是玄学,刚开始测试的都失败了,后来测试又没有问题,。。。。。。。醉了,废了一下午的时间。