php7 新特性

三元运算符增加了一个快捷书写方式

原本格式为是(expr1) ? (expr2) : (expr3) 

如果expr1结果为True,则返回expr2的结果。 

新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3 

如果expr1结果为True,则返回expr1的结果

  1. $expr1=1;
  2. $expr2=2;
  3. //原格式
  4. $expr=$expr1?$expr1:$expr2
  5. //新格式
  6. $expr=$expr1?:$expr2

输出结果: 

1

空合并运算符(??)

简化判断

$param = $_GET['param'] ?? 1;

相当于:

$param = isset($_GET['param']) ? $_GET['param'] : 1;

Json更懂中文(JSON_UNESCAPED_UNICODE)

  1. echo json_encode("中文", JSON_UNESCAPED_UNICODE);
  2. //输出:"中文"

二进制

  1. $bin = 0b1101;
  2. echo $bin;
  3. //13

Unicode codepoint 转译语法

这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。

echo "\u{9876}"

旧版输出:\u{9876} 

新版输入:顶

使用 ** 进行幂运算

加入右连接运算符 * 来进行幂运算。 同时还支持简写的 *= 运算符,表示进行幂运算并赋值。

  1. printf("2 ** 3 == %d\n", 2 ** 3);
  2. printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
  3.  
  4. $a = 2;
  5. $a **= 3;
  6. printf("a == %d\n", $a);

输出 

2 ** 3 == 8 

2 * 3 * 2 == 512 

a == 8

 

 

支持为负的字符串偏移量

现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).

  1. var_dump("abcdef"[-2]);
  2. var_dump(strpos("aabbcc", "b", -3));

以上例程会输出:

  1. string (1) "e"
  2. int(3)

常量引用

“常量引用”意味着数组可以直接操作字符串和数组字面值。举两个例子:

  1. function randomHexString($length) {
  2. $str = '';
  3. for ($i = 0; $i < $length; ++$i) {
  4. $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string
  5. }
  6. }
  7. function randomBool() {
  8. return [false, true][mt_rand(0, 1)]; // direct dereference of array
  9. }

常量增强

允许常量计算,允许使用包含数字、字符串字面值和常量的标量表达式

  1. const A = 2;
  2. const B = A + 1;
  3. class C
  4. {
  5. const STR = "hello";
  6. const STR2 = self::STR + ", world";
  7. }

允许常量作为函数参数默认

function test($arg = C::STR2)

类常量可见性 

现在起支持设置类常量的可见性。

  1. class ConstDemo
  2. {
  3. const PUBLIC_CONST_A = 1;
  4. public const PUBLIC_CONST_B = 2;
  5. protected const PROTECTED_CONST = 3;
  6. private const PRIVATE_CONST = 4;
  7. }

通过define()定义常量数组

  1. define('ANIMALS', ['dog', 'cat', 'bird']);
  2. echo ANIMALS[1]; // outputs "cat"

函数变量类型声明

两种模式 : 强制 ( 默认 ) 和 严格模式 

类型:array,object(对象),string、int、float和 bool

  1. class bar {
  2. function foo(bar $foo) {
  3. }
  4. //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:
  5. function foo(array $foo) {
  6. }
  7. }
  8.   foo(array(1, 2, 3)); // 正确,因为传入的是数组
  9.   foo(123); // 不正确,传入的不是数组
  10.  
  11. function add(int $a)
  12. {
  13. return 1+$a;
  14. }
  15. var_dump(add(2));
  16.  
  17. function foo(int $i) { ... }
  18. foo(1); // $i = 1
  19. foo(1.0); // $i = 1
  20. foo("1"); // $i = 1
  21. foo("1abc"); // not yet clear, maybe $i = 1 with notice
  22. foo(1.5); // not yet clear, maybe $i = 1 with notice
  23. foo([]); // error
  24. foo("abc"); // error

参数跳跃

如果你有一个函数接受多个可选的参数,目前没有办法只改变最后一个参数,而让其他所有参数为默认值。 

RFC上的例子,如果你有一个函数如下:

function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }

那么有没有办法设置$report_errors=false,而其他两个为默认值。为了解决这个跳跃参数的问题而提出:

create_query("deleted=0", "name", default, default, false);

上一篇:centos7 安装PHP7


下一篇:工程师手记-升级PNI以支持PHP7