蚊章汇 - PHP 7
type: channel
link: https://linuxcn.bwsl.wang/tag/PHP+7/
items: PHP 7.0 升级备注
items: 在 CentOS 7.x / Fedora 21 上面体验 PHP 7.0

PHP 7.0 升级备注
type: item
date: 2015-07-20T15:31:00+08:00
description: PHP 7.0.0 beta1 发布了，在带来了引人注目的性能提升的同时，也带来了不少语言特性方面的改变。以下由 LCTT 翻译自对官方的升级备注，虽然目前还不是正式发布版，不过想必距离正式发布的特性已经差别不大了。（本文会持续追踪更新）向后不兼容的变化语言变化变量处理的变化间接变量、属性和方法引用现在以从左到右的语义进行解释。一些例子：$$foo['bar']['baz'] // 解释做 ($$foo)['bar']['baz'] $foo->$bar['baz'] // 解释做 ($foo->$bar)['baz'] $foo->$bar['baz']() // 解释做 ($foo->$bar)['baz']() Foo::$bar['baz']() // 解释做 (Foo::$bar)['baz']() 要恢复以前的行为，需要显式地加大括号：${$foo['bar']['baz']} $foo->{$bar['baz']} $foo->{$bar['baz']}() Foo::{$bar['baz']}() 全局关键字现在只接受简单变量。像以前的global $$foo->bar; 现在要求如下写法：global ${$foo->bar}; 变量或函数调用的前后加上括号不再有任何影响。例如下列代码，函数调用结果以引用的方式传给一个函数function getArray() { return [1, 2, 3]; } $last = array_pop(getArray()); // Strict Standards: 只有变量可以用引用方式传递 $last = array_pop((getArray())); // Strict Standards: 只有变量可以用引用方式传递 现在无论是否使用括号，都会抛出一个严格标准错误。以前在第二种调用方式下不会有提示。数组元素或对象属性自动安装引用顺序创建，现在的结果顺序将不同。例如：$array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array); 现在结果是 ["a" => 1, "b" => 1]，而以前的结果是 ["b" => 1, "a" => 1]。相关的 RFC：https://wiki.php.net/rfc/uniform_variable_syntaxhttps://wiki.php.net/rfc/abstract_syntax_treelist() 的变化list() 不再以反序赋值，例如：list($array[], $array[], $array[]) = [1, 2, 3]; var_dump($array); 现在结果是 $array == [1, 2, 3] ，而不是 [3, 2, 1]。注意仅赋值顺序变化了，而赋值仍然一致（LCTT 译注：即以前的 list()行为是从后面的变量开始逐一赋值，这样对与上述用法就会产生 [3,2,1] 这样的结果了。）。例如，类似如下的常规用法list($a, $b, $c) = [1, 2, 3]; // $a = 1; $b = 2; $c = 3; 仍然保持当前的行为。不再允许对空的 list() 赋值。如下全是无效的：list() = $a; list(,,) = $a; list($x, list(), $y) = $a; list() 不再支持对字符串的拆分（以前也只在某些情况下支持）。如下代码：$string = "xy"; list($x, $y) = $string; 现在的结果是： $x == null 和 $y == null （没有提示），而以前的结果是： $x == "x" 和 $y == "y" 。此外， list() 现在总是可以处理实现了 ArrayAccess 的对象，例如：list($a, $b) = (object) new ArrayObject([0, 1]); 现在的结果是： $a == 0 和 $b == 1。 以前 $a 和 $b 都是 null。相关 RFC:https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_listhttps://wiki.php.net/rfc/fix_list_behavior_inconsistencyforeach 的变化foreach() 迭代不再影响数组内部指针，数组指针可通过 current()/next() 等系列的函数访问。例如：$array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); } …

在 CentOS 7.x / Fedora 21 上面体验 PHP 7.0
type: item
date: 2015-05-25T17:39:09+08:00
description: PHP是一种为我们熟知的通用服务器网页脚本语言。非常多的在线网站都是用PHP编写的。PHP这些年来一直在持续进化，丰富其功能，变得易于使用，更好地组织的脚本语言。目前PHP的开发团队正筹备下一个PHP版本的发行，名字是PHP 7。现在的PHP版本为PHP 5.6，可能你清楚PHP 6已经流产了，PHP 7的支持者们不希望下一个重要的版本被其他分支混淆，即过去已经停止很久的PHP 6。所以决定下一个PHP主要的发行版本叫PHP 7，而不是PHP 6。PHP 7.0预计在今年十一月份发行。在下一代主要PHP版本里有一些不错的功能：为了改善执行效率与内存占用，新的版本添加了PHPNG功能。引入了JIT引擎来动态编译Zend操作码为自然机器码，以此来达到更快的处理性能。这项功能允许随后的程序调用同一份代码，这样会运行快很多。AST（抽象语法树）是最新添加的功能，它可以增强支持PHP的扩展性和用户应用。添加异步编程功能以支持同一个请求中的并行任务。新的版本会支持独立的多线程网页服务器，这样可以使用一个单独的存储池处理很多并发的请求。在CentOS/Fedora上安装PHP 7让我们来看看怎样在CentOS 7和Fedora 21安装PHP7。为了安装PHP7，我们首先需要克隆php-src 仓库。当克隆工作完成，我们再配置和编译它。进行下一步之前，我们要确保已经在LInux系统下安装了如下的组件，否则PHP编译会返回错误中止。Gitautoconfgccbison所有上面提到的要求可以使用Yum软件包管理器安装。以下一条命令即可完成：yum install git autoconf gcc bison 准备好开始安装PHP7了吗？让我们先创建一个PHP7目录，作为你的当前工作目录。mkdir php7 cd php7 现在克隆php-src仓库，在终端里运行下面的命令。git clone https://git.php.net/repository/php-src.git 工作应该会在几分钟后完成，这里是一个样例输出，你应该会在任务完成时看见。[root@localhost php7]# git clone https://git.php.net/repository/php-src.git Cloning into 'php-src'... remote: Counting objects: 615064, done. remote: Compressing objects: 100% (127800/127800), done. remote: Total 615064 (delta 492063), reused 608718 (delta 485944) Receiving objects: 100% (615064/615064), 152.32 MiB | 16.97 MiB/s, done. Resolving deltas: 100% (492063/492063), done. 让我们来配置，编译PHP7，在终端运行下面的命令，开始配置工作：cd php-src ./buildconf 下面是./buildconf命令的样例输出。[root@localhost php-src]# ./buildconf buildconf: checking installation... buildconf: autoconf version 2.69 (ok) rebuilding aclocal.m4 rebuilding configure rebuilding main/php_config.h.in 使用下面的命令，继续配置进程：./configure \ --prefix=$HOME/php7/usr \ --with-config-file-path=$HOME/php7/usr/etc \ --enable-mbstring \ --enable-zip \ --enable-bcmath \ --enable-pcntl \ --enable-ftp \ --enable-exif \ --enable-calendar \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-wddx \ --with-curl \ --with-mcrypt \ --with-iconv \ --with-gmp \ --with-pspell \ --with-gd \ --with-jpeg-dir=/usr \ --with-png-dir=/usr \ --with-zlib-dir=/usr \ --with-xpm-dir=/usr \ …