PHP 7.4 编程语言发布

经过一年的发展 提交 编程语言发布 PHP 7.4的新分支包含许多新功能,以及一些不兼容的更改。

钥匙 改进 在 PHP 7.4 中:

  • 类型化属性 — 类属性现在可以包含类型声明,例如:

    class User {
    public int $id;
    public string $name;
    }

  • 缩写 函数定义语法为“fn(参数列表) => expr”,并带有值作用域绑定。例如,“fn($x) => $x + $y”等价于“$fn2 = function ($x) use ($y) {return $x + $y;}”。
  • 速记分配操作员 “??=",可用于定义默认值(‘a ??= b’类似于‘a = a ?? b’,如果定义了‘a’,则保留其值,如果未定义,则赋值为‘b’);
  • 有限的 机会 保留从返回值类型派生的类型继承层次结构,或者将原始类型的层次结构转换为派生参数类型的相反层次结构的可能性(协方差 返回类型和参数类型逆变)。现在可以在 PHP 中使用以下结构:

    类 A {}
    class B extends A {}

    类 Producer {
    public function method(): A {}
    }
    class ChildProducer extends Producer {
    public function method(): B {}
    }

  • 数组“...$var”内部的解包运算符 允许 定义新数组时,对现有数组执行替换操作;

    $parts = ['苹果', '梨'];
    $fruits = ['香蕉', '橙子', …$parts, '西瓜'];
    // ['香蕉', '橙子', '苹果', '梨', '西瓜'];

  • 机会 以数字文字形式(1_000_000_00)用分隔符表示大数字的视觉呈现;
  • Поддержка 薄弱环节允许保留对对象的引用,但不会阻止垃圾回收器删除关联的对象;
  • 机制 对象序列化(Serializable 和 __sleep()/__wakeup() 的组合),取代了将被宣布过时的 Serializable 接口;

    // 返回包含对象所有状态的数组;
    public function __serialize(): array;

    // 从数组恢复对象的状态
    public function __unserialize(array $data): void;

  • 允许从方法中抛出异常 __toString();
  • 新增了对预加载目标代码缓存的支持。配置中新增了一个参数。
    opcache.预加载这样,您就可以指定一个 PHP 脚本,该脚本将在服务器启动时编译并运行。此脚本可以通过直接包含其他文件或使用 opcache_compile_file() 函数来加载这些文件的操作码;
  • crc32c 函数已添加到 Hash 扩展中,用于使用 Castagnoli 多项式计算校验和;
  • 如果 PHP 构建时未安装 libargon,则 password_hash() 函数已更新,以支持 Sodium 库实现中的 argon2i 和 argin2id 密码哈希方法;
  • 新增了 mb_str_split() 函数,类似于 str_split() 函数,但它不是对字节进行操作,而是对多字节字符串中的字符位置进行操作;
  • strip_tags() 函数现在允许您传递一个标签名称数组,即,您现在可以指定 strip_tags($str, ['a', 'p']),而不是 strip_tags($str, ' ');
  • proc_open() 允许将操作数列在数组中,而不是指定要运行的字符串,并且还实现了重定向流和支持空文件描述符的功能;

    proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);

    // 就像 shell 中的 2>&1 一样
    proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);

    // 就像 shell 中的 2>/dev/null 或 2>nul 一样
    proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);

  • Firebird/Interbase、Recode 和 WDDX 扩展已从基础发行版中移除。这些扩展现在通过 PECL 分发;
  • 已转入该类别 过时的 诸如嵌套三元运算符(无需括号)、使用花括号访问数组元素和字符串(“$var{$idx}”)、is_real() 函数和强制转换为 real、使用 parent 关键字而无需指定父类、allow_url_include 配置选项以及在对象上使用 array_key_exists() 等功能。

    函数 get_magic_quotes_gpc() 和 get_magic_quotes_runtime() 已被声明为已弃用。
    hebrevc()、convert_cyr_string()、money_format()、ezmlm_hash()、restore_include_path()、ldap_control_paged_result_response()、ldap_control_paged_result()、ReflectionType::__toString()。

    在尝试处理函数中的无效字符时,会发出关于使用已弃用功能的警告。
    base_convert()、bindec()、octdec() 和 hexdec(),以及在 mb_ereg_replace() 中指定非字符串模式时。

来源: opennet.ru

添加评论