PHP7.4.0一些新特性

2019年11月28日,php.net发布了php7.4.0,根据php.net网站公开信息,博主来翻译一下本次更新的一些特性

强类型的类变量(Typed properties)

类属性在定义的时候,可以设置它的类型

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

上面的例子可以强制$user->id 指定为 integer 类型,$user->name 指定为 string 类型

箭头函数(Arrow functions)

箭头函数提供了一个简练的返回值的语法

$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);

PS: => 右边仅仅支持一句话语句,不支持多个分号的语句

子类可以更改父类方法返回类型(Limited return type covariance and argument type contravariance)

class A {}
class B extends A {}

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

仅仅使用自动加载的时候,才支持此特性。在单个文件中,只有非循环类型引用是可用的,因为所有类在被使用之前引入到工作空间

空合并赋值运算符(Null coalescing assignment operator)

$array['key'] ??= computeDefault();
// 约等于下面的语句
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

优雅合并数组(Unpacking inside arrays)

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// $fruits = ['banana', 'orange', 'apple', 'pear', 'watermelon'];
// 等于下面的操作,保留了数组元素的顺序
$fruits = array_merage(['banana', 'orange'], $parts, ['watermelon']);

数字类型文字分隔符(Numeric literal separator)

6.674_083e-11; // float 浮点型
299_792_458;   // decimal 十进制
0xCAFE_F00D;   // hexadecimal 十六进制
0b0101_1111;   // binary 二进制

数字文本可以在数字之间包含下划线。这点博主有点懵逼,等博主用7.4.0跑一下看看什么结果

弱引用(Weak references)

弱引用允许码农保留对某个对象的引用,该对象不会阻止该对象被销毁。

允许从__toString()中抛出异常(Allow exceptions from __toString())

现在允许从 __toString() 方法中抛出异常。之前这么做,php会报一个致命错误(fatal error)。字符串转换方法(__toString())中现有的可恢复致命错误已转换为错误异常。换句话说:__toString方法中可以随便抛异常,上层可以捕获这异常并可以进行相应处理,旧版php不能这么做

CURL

libcurl在版本>=7.56.0中,CURLFile 支持 stream wrappers 和空白文件名(plain file names)

过滤器(Filter)

FILTER_VALIDATE_FLOAT 过滤器支持最小范围(min_range)和最大范围(max_range)参数选项, FILTER_VALIDATE_INT也是如此

FFI扩展

FFI是一个新的PHP扩展(extension),它可以简单地调用C语言类库的原生方法、使用原生变量、创建或访问数据结构

GD扩展

添加了IMG_FILTER_SCATTER 图像过滤器常量以对图像应用散射过滤器。

哈希(Hash)

增加了依赖于Castagnoli’s 多项式的CRC32哈希算法。这个CRC32用于存储系统中,例如iSCSI、SCTP、Btrfs、ext4。

多字节字符串(Multibyte String)

增加了mb_str_split()函数,它提供了和str_split()相同的功能,但是操作的是代码点(code point),而不是字节(Bytes)

代码点(code point)是指与一个编码表中的某个字符对应的代码值。UTF-16编码采用不同长度的编码表示所有Unicode代码点,每个16位二进制表示一个代码单元(code unit)。基本字符的范围为[U+0000~U+FFFF],辅助字符,即上面提到的增补字符,其两个代码单元的范围分别为[U+D800~U+DBFF]和[U+DC00~U+DFFF]。这样很容易就能知道一个代码单元是一个基本字符的编码还是一个辅助字符的第一或第二部分。

OPcache

支持预加载代码

正则(Regular Expressions (Perl-Compatible))

preg_replace_callback()preg_replace_callback_array()函数添加了flags参数, 这个参数支持PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL常量。这会影响传递给回调函数的匹配内容的数组格式。

PDO

用户名和密码现在可以指定为mysql、mssql、sybase、dblib、firebird和oci驱动程序的PDO DSN的一部分。以前,只支持pgsql驱动程序。如果在构造函数和DSN中都指定了用户名/密码,则构造函数优先。

现在可以在SQL查询中转义问号,以避免它们被解释为参数占位符。使用 ?? 向数据库发送单个问号,例如使用PostgreSQL JSON key 存在 (?) 操作符。

PDO_OCI

现在可以使用PDOStatement::getColumnMeta()方法了

PDO_SQLite

PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) 可以检查是否是只读状态,而不用修改数据库内容

PDO::errorInfo() and PDOStatement::errorInfo()中,PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) 启用了SQLite3 扩展结果码(result code)

尚未完成….

一步步教你编写不可维护的PHP代码

随着失业率越来越高( 不是中国 ),很多人意识到保全自己的工作是多么的重要。那么,什么是保住自己工作,并让自己无可替代的好方法呢?一个很简单的事实是只要你的代码没有人能够维护,那么你就成功保住了工作。编写不可维护的代码是一个特殊的技能,但奇怪的是,似乎对某些开发者来说是很自然的。不过对于剩下的开发者来说,这里有一些技巧和提示来让你开始写不可维护的代码。

首先要做的事情

第一步,从找工作开始。你应该寻找合适的公司,在那里你可以尽情发挥并实现你那不可维护的潜力。 你不一定需要成为公司的 PHP 大牛如果是那更好。找工作时,如果工作描述提到需要从其它的迁移到 PHP (所以你知道你会做主),或者也可以搜索那种需要10年 PHP5 工作经验的误导性工作,再加上熟练使用 FrontPage 和 Netscape Composer 。一旦你获得这种千载难逢的机会,从第一天开始就要采取措施。在会议上发言,让你的意见被听到。大胆谈论面向对象的架构设计,企业,改革方案,怎样让够好变得更好,当然你也得做出相应的承诺。确保每个人在重要的编码环节都咨询你的意见。

继续阅读“一步步教你编写不可维护的PHP代码”