PHP 7.4.0 Released!

The PHP development team announces the immediate availability of PHP 7.4.0. This release marks the fourth feature update to the PHP 7 series.

PHP 7.4.0 comes with numerous improvements and new features such as:

Typed Properties

Arrow Functions

Limited Return Type Covariance and Argument Type Contravariance

Unpacking Inside Arrays

Numeric Literal Separator

Weak References

Allow Exceptions from __toString()

Opcache Preloading

Several Deprecations

Extensions Removed from the Core

1.Typed Properties 强类型

Class中预定义变量后, 只能赋值相应的数据类型

All types are supported, with the exception of void and callable:

class User {

public int $id;

public string $name;

}

They are also allowed with the var notation:

var bool $flag;

The same type applies to all properties in a single declaration:

public float $x, $y;

What happens if we make an error on the property type? Consider the following code:

class User {

public int $id;

public string $name;

}

$user = new User;

$user->id = 10;

$user->name = [];

Fatal error:

Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9

2.Arrow Function 箭头函数(简短闭包)

箭头函数为了闭包内只有一行代码的闭包函数提供了更简洁的方式

7.4.0之前

array_map(function (User $user) {

return $user->id;

}, $users)

之后

array_map(fn (User $user) => $user->id, $users)

function cube($n){

return ($n * $n * $n);

}

$a = [1, 2, 3, 4, 5];

$b = array_map('cube', $a);

print_r($b);

之后

$a = [1, 2, 3, 4, 5];

$b = array_map(fn($n) => $n * $n * $n, $a);

print_r($b);

$factor = 10;

$calc = function($num) use($factor){

return $num * $factor;

};

之后

$factor = 10;

$calc = fn($num) => $num * $factor;

3.Limited return type covariance and argument type contravariance 协变返回和逆变参数

子类和父类

协变返回

interface Factory {

function make(): object;

}

class UserFactory implements Factory {

// 将比较泛的 object 类型,具体到 User 类型

function make(): User;

}

逆变参数

interface Concatable {

function concat(Iterator $input);

}

class Collection implements Concatable {

// 将比较具体的 Iterator参数类型,逆变成接受所有的 iterable类型

function concat(iterable $input) {/* . . . */}

}

4.Unpacking Inside Arrays 数组内解包

三个点...叫做Spread运算符, 第一个好处是性能

Spread 运算符应该比 array_merge 拥有更好的性能。这不仅仅是 Spread 运算符是一个语法结构,而 array_merge 是一个方法。还是在编译时,优化了高效率的常量数组

$parts = ['apple', 'pear'];

$fruits = ['banana', 'orange', ...$parts, 'watermelon'];

var_dump($fruits);


array(5) { [0]=> string(6) "banana" [1]=> string(6) "orange" [2]=> string(5) "apple" [3]=> string(4) "pear" [4]=> string(10) "watermelon" }

RFC 声明我们可以多次扩展同一个数组。而且,我们可以在数组中的任何地方使用扩展运算符语法,因为可以在扩展运算符之前或之后添加普通元素。所以,就像下面代码所示的那样:

$arr1 = [1, 2, 3];

$arr2 = [4, 5, 6];

$arr3 = [...$arr1, ...$arr2];

$arr4 = [...$arr1, ...$arr3, 7, 8, 9];

也可以将函数返回的数组直接合并到另一个数组:

function buildArray(){

return ['red', 'green', 'blue'];

}

$arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];

也可以写成生成器

function generator() {

for ($i = 3; $i <= 5; $i++) {

yield $i;

}

}

$arr1 = [0, 1, 2, ...generator()];

但是我们不允许合并通过引用传递的数组。 考虑以下的例子:

$arr1 = ['red', 'green', 'blue'];

$arr2 = [...&$arr1];

无论如何,如果第一个数组的元素是通过引用存储的,则它们也将通过引用存储在第二个数组中。 这是一个例子:

$arr0 = 'red';

$arr1 = [&$arr0, 'green', 'blue'];

$arr2 = ['white', ...$arr1, 'black'];

上面这个是OK的

5.Numeric Literal Separator

数字字符间可以插入分隔符号

Null Coalescing Assignment Operator

Added with PHP 7, the coalesce operator (??) comes in handy when we need to use a ternary operator in conjunction with isset(). It returns the first operand if it exists and is not NULL. Otherwise, it returns the second operand. Here is an example:

$username = $_GET['user'] ?? ‘nobody';

What this code does is pretty straightforward: it fetches the request parameter and sets a default value if it doesn’t exist. The meaning of that line is clear, but what if we had much longer variable names as in this example from the RFC?

$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';

In the long run, this code could be a bit difficult to maintain. So, aiming to help developers to write more intuitive code, this RFC proposes the introduction of the null coalescing assignment operator (??=). So, instead of writing the previous code, we could write the following:

$this->request->data['comments']['user_id'] ??= ‘value’;

If the value of the left-hand parameter is null, then the value of the right-hand parameter is used.

Note that, while the coalesce operator is a comparison operator, ??= is an assignment operator.

This proposal has been approved with 37 to 4 votes.

6.Weak References

弱引用使程序员可以保留对对象的引用,不会阻止对象被销毁。

$object = new stdClass;

$weakRef = WeakReference::create($object);

var_dump($weakRef->get());

unset($object);

var_dump($weakRef->get());

The first var_dump prints object(stdClass)#1 (0) {}, while the second var_dump prints NULL, as the referenced object has been destroyed.

object(stdClass)#1 (0) {

}

NULL

7.Allow Exceptions from __toString()

现在允许从 __toString() 引发异常,以往这会导致致命错误,字符串转换中现有的可恢复致命错误已转换为 Error 异常。

foo = $foo;
}

public function __toString() {
return $this->foo;
}
}

$class = new TestClass('Hello');
echo $class;
?>

输出Hello

8.Opcache Preloading 预加载

指定要在服务器启动时期进行编译和缓存的 PHP 脚本文件, 这些文件也可能通过 include 或者 opcache_compile_file() 函数 来预加载其他文件。 所有这些文件中包含的实体,包括函数、类等,在服务器启动的时候就被加载和缓存, 对于用户代码来讲是“开箱可用”的。

php.ini

opcache.preload

On server startup – before any application code is run – we may load a certain set of PHP files into memory – and make their contents “permanently available” to all subsequent requests that will be served by that server. All the functions and classes defined in these files will be available to requests out of the box, exactly like internal entities.

9.Several Deprecations 废弃的

Nested ternary operators without explicit parentheses ¶

Nested ternary operations must explicitly use parentheses to dictate the order of the operations. Previously, when used without parentheses, the left-associativity would not result in the expected behaviour in most cases.

Array and string offset access using curly braces ¶

The array and string offset access syntax using curly braces is deprecated. Use $var[$idx] instead of $var{$idx}.

(real) cast and is_real() function ¶

The (real) cast is deprecated, use (float) instead.

The is_real() function is also deprecated, use is_float() instead.

Unbinding $this when $this is used ¶

Unbinding $this of a non-static closure that uses $this is deprecated.

parent keyword without parent class ¶

Using parent inside a class without a parent is deprecated, and will throw a compile-time error in the future. Currently an error will only be generated if/when the parent is accessed at run-time.

allow_url_include INI option ¶

The allow_url_include ini directive is deprecated. Enabling it will generate a deprecation notice at startup.

Invalid characters in base conversion functions ¶

Passing invalid characters to base_convert(), bindec(), octdec() and hexdec() will now generate a deprecation notice. The result will still be computed as if the invalid characters did not exist. Leading and trailing whitespace, as well as prefixes of type 0x (depending on base) continue to be allowed.

Using array_key_exists() on objects ¶

Using array_key_exists() on objects is deprecated. Instead either isset() or property_exists() should be used.

Magic quotes functions ¶

The get_magic_quotes_gpc() and get_magic_quotes_runtime() functions are deprecated. They always return FALSE.

hebrevc() function ¶

The hebrevc() function is deprecated. It can be replaced with nl2br(hebrev($str)) or, preferably, the use of Unicode RTL support.

convert_cyr_string() function ¶

The convert_cyr_string() function is deprecated. It can be replaced by one of mb_convert_string(), iconv() or UConverter.

money_format() function ¶

The money_format() function is deprecated. It can be replaced by the intl NumberFormatter functionality.

ezmlm_hash() function ¶

The ezmlm_hash() function is deprecated.

restore_include_path() function ¶

The restore_include_path() function is deprecated. It can be replaced by ini_restore('include_path').

Implode with historical parameter order ¶

Passing parameters to implode() in reverse order is deprecated, use implode($glue, $parts) instead of implode($parts, $glue).

COM ¶

Importing type libraries with case-insensitive constant registering has been deprecated.

Filter ¶

FILTER_SANITIZE_MAGIC_QUOTES is deprecated, use FILTER_SANITIZE_ADD_SLASHES instead.

Multibyte String ¶

Passing a non-string pattern to mb_ereg_replace() is deprecated. Currently, non-string patterns are interpreted as ASCII codepoints. In PHP 8, the pattern will be interpreted as a string instead.

Passing the encoding as 3rd parameter to mb_strrpos() is deprecated. Instead pass a 0 offset, and encoding as 4th parameter.

Lightweight Directory Access Protocol ¶

ldap_control_paged_result_response() and ldap_control_paged_result() are deprecated. Pagination controls can be sent along with ldap_search() instead.

Reflection ¶

Calls to ReflectionType::__toString() now generate a deprecation notice. This method has been deprecated in favor of ReflectionNamedType::getName() in the documentation since PHP 7.1, but did not throw a deprecation notice for technical reasons.

The export() methods on all Reflection classes are deprecated. Construct a Reflection object and convert it to string instead:

Socket ¶

The AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES flags for socket_addrinfo_lookup() are deprecated, due to an upstream deprecation in glibc.

10.Extensions Removed from the Core

These extensions have been moved to PECL and are no longer part of the PHP distribution. The PECL package versions of these extensions will be created according to user demand.

  • Firebird/Interbase - access to an InterBase and/or Firebird based database is still available with the PDO Firebird driver.
  • Recode
  • WDDX

更多详情可见RFC文档 https://wiki.php.net/rfc

php7.4 更新特性的更多相关文章

  1. php7.0 和 php7.1新特性

    PHP7.1 新特性 1.可为空(Nullable)类型 类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null .可以通过在类型前面加上一个问号来使之成为 ...

  2. 浅谈PHP7的新特性

    我以前用过的php的最高版本是php5.6.在换新工作之后,公司使用的是PHP7.据说PHP7的性能比之前提高很多.下面整理下php7的新特性.力求简单了解.不做深入研究. 1.变量类型声明 函数的参 ...

  3. php5.6.x到php7.0.x特性

    php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Clas ...

  4. git与eclipse集成之更新特性分支代码到个人特性分支

    1.1. 更新特性分支代码到个人特性分支 在基于特性分支开发的过程中,存在多人向特性分支提交代码的情况,开发者需要关注特性分支代码与个人分支代码保持同步,否则可能导致提交代码冲突. 具体代码同步步骤: ...

  5. 《PHP7底层设计与源码实现》学习笔记1——PHP7的新特性和源码结构

    <PHP7底层设计与源码实现>一书的作者陈雷亲自给我们授课,大佬现身!但也因此深感自己基础薄弱,遂买了此书.希望看完这本书后,能让我对PHP7底层的认识更上一层楼.好了,言归正传,本书共1 ...

  6. [转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

    PHP7和PHP5上的安全区别 preg_replace()不再支持/e修饰符 利用\e修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述: 如果设置了这个被弃用的修饰符, preg_repl ...

  7. PHP7.x新特性

    1.太空船操作符太空船操作符用于比较两个表达式. 当$a小于. 等于或大于$b时它分别返回-1. 0或1. // Integers echo 1 <=> 1; // 0 echo 1 &l ...

  8. php7的新特性

    新增操作符1.??$username = $_GET['user'] ?? '';$username = isset($_GET['user']) ? $_GET['user'] : 'nobody' ...

  9. PHP7.1新特性一览

    PHP7.0的性能是PHP5.6的两倍 http://www.phpchina.com/article-40237-1.html 可空类型 list 的方括号简写 void 返回类型 类常量属性设定 ...

随机推荐

  1. python基础知识字符串与元祖

    https://blog.csdn.net/hahaha_yan/article/details/78905495 一.字符串的类型 ##表示字符串: 'i like the world' " ...

  2. bytes与网络通信

    字符串是人机交互的符号: bytes是最接近计算机本身的信息表示方法. 网络通信是计算机与计算机之间的通信. 所有的通信信息,必须转化为bytes流的方式在计算机间传递. bytes与数据类型无关,与 ...

  3. Daily consumption

    Bill record, standard of living, record every consumption, income, expenditure, manage your own life

  4. 快站中如果点击报错,则用jquery的点击方式来书写!!!

    如题 上传快站常用的css /* 上传快站额外的css */ .sys-title-1 { display: none !important; } .nav-header { height: 0 !i ...

  5. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  6. 垃圾邮件分类实战(SVM)

    1. 数据集说明 trec06c是一个公开的垃圾邮件语料库,由国际文本检索会议提供,分为英文数据集(trec06p)和中文数据集(trec06c),其中所含的邮件均来源于真实邮件保留了邮件的原有格式和 ...

  7. div模拟textarea且高度自适应

    需求 我们知道文本超出 textarea 高度后,textarea 就会出现滚动条,需求就是让 textarea 高度跟随文本高度变化,屏蔽滚动条,原来做过用js去监听文本行数,然后改变文本框的高度, ...

  8. mybatis 根据多个id查询数据 foreach标签

    //根据设备多个id获取设备信息 public List<Devices> getDevicesAll(@Param("devicesIds") String[] de ...

  9. dplyr

    The d is for dataframes, the plyr is to evoke pliers. Pronounce however you like. dplyr包可用于处理 R 内部或者 ...

  10. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...