玄学-assert

Jun 1, 2018 09:54 · 83 words · 1 minute read PHP

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()

真的是玄学,刚开始测试的都失败了,后来测试又没有问题,。。。。。。。醉了,废了一下午的时间。

tweet Share