更新到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
    <script language='php'>
        // code
    </script>
    
    //PHP ASP tags
    <%
    // code
    %>
    Short tags
    <%=$str; %>
    

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

  • 更新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阵营加入更多的开发者。有好的社区才有好的未来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 最好的语言发布了新的版本,一个划时代的大版本:PHP7。 PHP7修复了大量BUG,新增了功能和语法糖。这些改动涉...
    人在码途阅读 595评论 2 5
  • PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来...
    梦幻_78af阅读 2,097评论 1 10
  • 2015.12.3 发生了两件大事, PHP7 问世了, Swift 开源了。最好的语言发布了新的版本,一个划时代...
    搬砖家阅读 547评论 0 1
  • 把当前目录作为Root Document只需要这条命令即可:php -S localhost:3300 也可以指定...
    绚烂的时光阅读 731评论 0 1
  • 读了今天的晨读,才发现一句真理:道高一尺魔高一丈!就是商家总有各种各样的方法影响你得消费行为,周围人总有各种各样的...
    芳芳Fancy阅读 135评论 0 0