不支持的语法列表

Z5加密支持 PHP 7.2 支持的绝大多数语法,但不支持以下语法:

引用

引用大部分情况下工作正常,但受限于PHP自身限制,已知以下情况执行不正确,暂时没有较好的修复方案。可正常编译,但运行结果不正确。

$this->a = &$var; // 给一个对象成员赋引用
$a['a'] = &$var; // 给一个数组成员赋引用

extract

不支持extract函数。编译时正常,但运行结果不正确。

extract(['a' => 'b']);

写静态成员变量

目前,Z5加密对于静态成员变量,支持在所有版本下读,但PHP 5.2下不可写。可正常编译,PHP 5.2下运行将提示语法错误。

class A { static $b = 0 }
echo A::$b; // 支持
$a::$b = 10; // 支持PHP 5.3+
unset($a::$b); // PHP自己都不支持

instanceof

因PHP 5.2实现问题,instanceof在PHP 5.2下可能出现问题。可正常编译,但在PHP 5.2下运行结果不正确。

class A {}
class B extends A {}
$c = new A();
print_r($c instanceof A); // 正确结果为true,PHP 5.3+返回true,PHP 5.2返回false

FUNC_GET_ARG(s) / FUNC_NUM_ARG

和PHP 7.2相同,不支持动态调用func_get_args。将返回不正确结果。

func_get_args(); // 支持
$a = func_num_args(); // 支持
$b = func_get_arg($a); // 支持
$c = call_user_func_array('func_get_args', []); // 支持
$d = 'func_get_args'; $d(); // PHP 7.2和本加密都不支持
$d = 'func_get_args'; call_user_func_array($d, []); // PHP 7.2和本加密都不支持

Lambda / 函数内部定义其他结构

暂不支持以下类似代码,将在编译时提示编译失败:

function a () {
  function b () {}
  class A {}
  $a = function () use ($b) {}
  $b = function () {}
  $c = new class {}
}

Try / Catch

不支持以下代码,且今后无支持计划,将在编译时提示编译失败:

try {
  // something
} catch (Exception $e) {
  // something
} finally {
  // something
}

Generator / Yield

暂不支持Generator / Yield,将在编译时提示编译失败:

function count_to_ten() {
    yield 1;
    yield 2;
    yield from [3, 4];
    yield from new ArrayIterator([5, 6]);
    yield from seven_eight();
    return yield from nine_ten();
}

类型相关

暂不支持定义函数返回类型,将在编译时提示编译失败:

function a (): callable {
  return 'Hello';
}

其他

COALESCE

暂不支持??语法,将在编译时提示编译失败:

function a () {
  return $a ?? 10;
}

TICKS

暂不支持declare / ticks语法,将在编译时提示编译失败:

declare(ticks = 1) {
  // something
}

RECV_VARIADIC

暂不支持可变参数,请使用func_get_args替代,将在编译时提示编译失败:

function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}