更新到PHP 7吧

2016-07-11  本文已影响0人  ngsh

PHP 7已经发布了不短的时间,也是PHP社区10多年来最激动人心的更新。新的引擎Zend Engine 3的“卖点”中最重要的就是性能、速度的提升。尽管引入了一些向后不兼容的更改,但是绝逼值得我们升级。

2016年7月10日(就在今天),官方的PHP5.5.X的版本前面就开始有一个“Old”开头了,按计划今年8月28日,5.6.X也不再更新了。

尽管有一些breaking changes,但是从5.5、5.6升到7,仍要比5.2升到5.3容易的多。熟悉PHP的开发者都知道为什么PHP会直接从v5跳到v7,v6想加入原生的Unicode支持,其实还有5.3就有的Closures以及Namespace等的特性,但是大约5年的时间最后都没有完成。最终标榜性能的分支phpng以PHP 7的身份公布于众。

下面我要给大家列一下PHP有哪些更新:

移除了不再建议使用的特性:

这些特性在使用的时候如果开启的错误级别较高的话,会触发E_DEPRECATED错误,PHP7将大量的特性直接移除不再能使用。

一致变量语法

这个特性是针对构建复杂动态的表达式的时候如何解析所提出来的。

Expr PHP5 PHP7
$$ng['shell'] ${$ng['shell']} ($$ng)['shell']
$ng->$shell['ngshell'] $ng->{$shell['ngshell']} ($ng->$shell)['ngshell']
$ng->$shell['ngshell']() $ng->{$shell['ngshell']}() ($ng->$shell)['ngshell']()
NgClass::$shell['ngshell'] NgClass::{$shell['ngshell']} (NgClass::$shell)['ngshell']
// access a array key
(expression)['ngshell']
// access a property
(expression)->ngshell
// call a method
(expression)->ngshell()
// access a static property
(expression)::$ngshell
// call a static property
(expression)::ngshell()
// call a callable
(expression)()
// access a char
(expression){0}

// dereferencing scalars
['classname', 'staticMethod']()
[$ngshellObj, "method"]()
'className'::staticMethod();

这些新的魔法的引进可能引发老代码很难调试的bug, 但是随着PHP7的普及,老的、写法不规范的会大量减少。

基本语言的改变

// PHP 7 before
$ngshell = isset($_GET['ngshell']) ? $_GET['ngshell'] : 'shell';
// PHP 7
$ngshell = $_GET['ngshell'] ?? 'shell';
// fall-through 
$ngshell = $_GET['ngshell'] ?? $_GET['shell'] ?? 'shell';
//PHP中第一个3位操作符。
// not return true or false, but -1, 0 or 1
// PHP 7 before
function sort_by_ngshell($a_shell, $b_shell) {
  return ($a_shell < $b_shell) ? -1 : (($a_shell > $b_shell) ? 1 : 0)
}
// PHP 7
function sort_by_ngshell($a_shell, $b_shell) {
  return $a_shell <=> $b_shell;
}
define('shells', ['bash', 'fish', 'ksh', 'csh', 'zsh']);
echo shells[0];

const ngshell = ['ngshell'];
echo ngshell[0];
$array_like_obj = new ArrayObject(['bash', 'ngshell']);
list(, $ngshell) = $array_like_obj;
echo $ngshell;
// intdiv()
var_dump(intdiv(3, 2));
//preg_replace_callback_array()
$bad_name = 'Ng-shell';
$new = preg_replace_callback_array(
    [   
        '/^(\w+)-/' => function($matches) { return strtolower($matches[0]); },
        '/-/' => function($matches) { return ''; },
    ], 
    $bad_name
);
echo $new;
// random_bytes() 和 random_int()
random_bytes(16)
random_int(0, 123456)
// session_start()
session_start([
    'use_strict' => true;
    'lazy_write' => false;
])
//加强安全的unserialize()
//dirname()
$path = '/shell/ngshell';
echo dirname($path, 2); // path: /
// password_hash() function deprecate salt parameter.

更可控的assertions

  1. 断言开启 2.断言关闭,可执行 3. 断言不回被编译0耗性能

更新了异常和错误的集成结构 加入了Throwable, 越来越像java。

Unicode 增强

PHP6夭折,不能说明php不支持unicode。

需要安装int扩展。

echo IntlChar::charName("\u{2603}");

Closure 增强

5.3开始支持Closure,5.4支持提前绑定$this, 引进实例方法Closure->bindTo()和静态方法Closure::bind() 两个方法其实是一样的,只是调用方式不一样。第二个方法很重要因为我们能动态改变Closure域。PHP7引进了实例方法Closure->call(),了解javascript的同学很容易理解。如下:

class Ngshell {
  private $version = '0.0.1';
}

$bindGeter = function($that) {
  echo $that . ':' . $this->version;
};

$ngshell = new Ngshell();

$bindGeter->call($ngshell, 'NGSHELL');
// NGSHELL:0.0.1

Generator 增强

Generator是在PHP5.5的时候引入的,也是我特别喜欢的一个特性。面试的时候发现居然好多人都没听过 : )
PHP7支持return语句,并且可以用Generator->getReturn()方法得到该值。还有支持Generator生成其他Generator。

面向对象的一些变更

不建议使用PHP4的构造函数,未来会彻底移除。

use Ngshell\Router;
use Ngshell\ORM;
use Ngshell\View;

use Ngshell\{
  Router,
  ORM,
  View,
  function ngshell,
  const NGSHELL
};
$ngObject = new class($args) extends Ng implements Shell {
  use Ngshell;
}

类型提示

PHP7最动人的一点无疑是标量类型提示,当然类型提示还包括return类型,严格类型等。

function ngshell(bool $b, float $f, int $i, string $s) {
  // code
}
function setHeader(int $statusCode, string $message) {
  header('HTTP/1.1 ' . $statusCode . ' ' . $message);
}
setHeader(404, 'Not Found');
setHeader('200', 'OK'); // '200' 强制为 200
setHeader(502.98, 'Bad Gateway'); // 强制为 502,随在此处合理,但证明了类型强制会失去精度。

//严格类型模式
declare(strict_types=1) 
namespace Ngshell\StrictTypes;
setHeader(502.98, 'Bad Gateway'); // 抛出\TypeError 异常
function add(int $a, int $b): int {
  return $a + $b;
}

结束语

目前7.1都已经出了,大家赶紧升级吧!期待PHP发展越来越好,期待着PHP阵营加入更多的开发者。有好的社区才有好的未来。

上一篇下一篇

猜你喜欢

热点阅读