更新到PHP 7吧

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将大量的特性直接移除不再能使用。

  • 请更新逻辑和页面混合的老页面,移除不兼容的东西。

    //PHP script tags
    
    
    //PHP ASP tags
    <%
    // code
    %>
    Short tags
    <%=$str; %>
    

    这些都不再支持,都改成,?>

  • 更新POSIX-Compatible Regular Expressions
    移除ereg拓展,移除下面的函数
    ereg(),eregi(),ereg_replace(),eregi_replace(),split(),spliti(),sql_regcase().

  • 移除多个switch语句中default cases,之前的PHP是允许声明多个default cases,并且只有最后一个case执行。

    switch($me) {
        default:
            echo 'ngshell';
            break;
        default:  // only this execute
            echo 'Yap';
            break;
    }
    
  • 移除了ext/mysql拓展,也就是说mysql_开头的函数都不再可用。你可以用ext/mysqli替换,当然支持用PDO。它们都支持prepared statements和调用stored procedures, 并且最重要的是支持sql占位符,更容易预防sql注入,更加安全。

一致变量语法

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

  • 类似$$ng['shell'] 该表达式改如何解析呢?
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']
  • Dereferencing任何有效的表达式
// 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];
  • list() 解包实现ArrayAccess接口的对象
$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的构造函数,未来会彻底移除。

  • Group use声明语句
use Ngshell\Router;
use Ngshell\ORM;
use Ngshell\View;

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

类型提示

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

  • 5.0 class/interface 类型提示
  • 5.1 array 类型提示
  • 5.4 callback 类型提示
  • 7.0 bool, float, int, string
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阵营加入更多的开发者。有好的社区才有好的未来。

你可能感兴趣的:(更新到PHP 7吧)