PHP 5.4 来了, 这是自 5.3 后的又一次主版本升级此次升级改动较为显著, 删除了一些过气儿的函数, 带来了高达 20% 的速度提升和更少的内存使用
新特性与改动
此次更新的关键新特性, 包括: 新增 traits, 更精简的 Array 数组语法, 供测试使用的内建 webserver, 可以闭包使用的 $this 指针, 实例化类成员访问,
PHP 5.4.0 性能大幅提升, 修复超过 100 个 bug. 废除了 register_globals, magic_quotes 以及安全模式 另外值得一提的是多字节支持已经默认启用了, default_charset 从 ISO-8859-1 已经变为 UTF-8. 默认发送 Content-Type: text/html; charset=utf-8, 你再也不需要在 HTML 里写 meta tag, 也无需为 UTF-8 兼容而传送额外的 header 了
Traits
Traits (横向重用 / 多重继承)是一组结构很像类 (但不能实例化) 的方法, 它可以让开发人员在不同的类中轻松地重用方法 PHP 为单继承语言, 子类只能继承一个父类, 于是 Traits 来了
Traits 的最佳应用是多类之间可以共享相同的函数打个比方, 我们要做个网站, 需要使用 Facebook 和 Twitter 的 APIs 我们要建 2 个类, 如果是以前, 我们需要写一个 cURL 的方法并且复制 / 粘贴到两个类中现在不用了, 使用 Traits 重用代码吧, 这次真正地遵循了 DRY(Don't Repeat Yourself)原则
代码如下:
- /** cURL wrapper trait */
- trait cURL
- {
- public function curl($url)
- {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($ch);
- curl_close($ch);
- return $output;
- }
- }
- /** Twitter API Class */
- class Twitter_API
- {
- use cURL; // use trait here
- public function get($url)
- {
- return json_decode($this->curl('http://api.twitter.com/'.$url));
- }
- }
- /** Facebook API Class */
- class Facebook_API
- {
- use cURL; // and here
- public function get($url)
- {
- return json_decode($this->curl('http://graph.facebook.com/'.$url));
- }
- }
- $facebook = new Facebook_API();
- echo $facebook->get('500058753')->name; // Rasmus Lerdorf
- /** Now demonstrating the awesomeness of PHP 5.4 syntax */
- echo (new Facebook_API)->get('500058753')->name;
- $foo = 'get';
- echo (new Facebook_API)->$foo('500058753')->name;
- echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name;
看明白了吗? 没有? 那你来瞅瞅更简单的例子
代码如下:
- trait Hello {
- public
- function hello() {
- return 'Hello';
- }
- }
- trait Cichui {
- public
- function cichui() {
- return 'cichui';
- }
- }
- class HelloCichui {
- use Hello,
- Cichui;
- public
- function the_end() {
- return '!';
- }
- }
- $o = new HelloCichui;
- echo $o - >hello(),
- $o - >cichui(),
- $o - >the_end();
- echo(new Hello) - >hello(),
- (new Cichui) - >cichui(),
- (new HelloCichui) - >the_end();
内建的 Web-Sever
在 Web 开发中, Apache HTTPD 是 PHP 的最佳拍档有时, 你开发时用不上需要配置 httpd.conf 的 apache 大杀器, 而只需要一个可以在命令行中使用的超小型 Webserver. 感谢 PHP(先感谢国家),PHP 5.4 这次内建了 CLI Web server(PHP CLI webserver 仅供开发使用, 谢绝产品用途)
举个栗子(windows 平台):
步骤一: 建立 web 根目录, Router 和 Index
在硬盘根目录 (比如 C 盘) 建立一个 public_html 目录, 目录里新建一个 router.php 文件, 把以下代码复制粘贴进去:
代码如下:
- // router.php
- if (preg_match('#\.php$#', $_SERVER['REQUEST_URI']))
- {
- require basename($_SERVER['REQUEST_URI']); // serve php file
- }
- else if (strpos($_SERVER['REQUEST_URI'], '.') !== false)
- {
- return false; // serve file as-is
- }
- ?>
再来新建一个 index.php 文件, 复制粘贴以下代码:
- // index.php
- echo 'Hello cichui.com Readers!';
- ?>
编辑你的 php.ini 文件, 找到 include_path 一行, 把 c:\public_html 添加进去(分号分隔):
1include_path = ".;C:\php\PEAR;C:\public_html"
存盘退出, 看下一步
步骤二: 运行 Web-Server
切换到 php 的安装目录, 敲下最关键的命令运行 Web-server
php -S 0.0.0.0:8080 -t C:\public_html router.php
开始了吗? 不要关闭窗口, 如果进程关闭 Web server 也跟着关闭了
打开浏览器: 访问 http://localhost:8080/index.php 吧,
Hello cichui.com Readers!
看到了吧? 对, 就是这个!
提示 1: 你可以考虑自建一个 php-server.bat 的批处理, 扔到桌面上以后就可以双击启动了
提示 2: 使用 0.0.0.0 而不是 localhost, 可以保证外网不会访问到你的 web serve
精简的 Array 数组语法
PHP 5.4 为您奉上精简的 array 数组语法:
代码如下:
- $fruits = array('apples', 'oranges', 'bananas'); // "old" way
- // 学 Javascript 的数组了
- $fruits = ['apples', 'oranges', 'bananas'];
- // 关联数组
- $array = [
- 'foo' => 'bar',
- 'bar' => 'foo'
- ];
当然, 旧语法依旧有效, 我们多了一种选择
数组成员访问解析(Array dereferencing*)
处理数组再也不需要临时变量了
假设我们需要获取 Fang Bin Xin 的 middle name,
echo explode( , Fang Bin Xin')[1]; // Bin
PHP 5.4 之前, 我们需要这样:
- $tmp = explode( , Fang Bin Xin');
- echo $tmp[1]; // Bin
现在, 我们可以这样玩了:
echo end(explode( , Fang Bin Xin')); // Xin
再来个高级点的例子:
代码如下:
- function foobar()
- {
- return ['foo' => ['bar' => 'Hello']];
- }
- echo foobar()['foo']['bar']; // Hello
* 瓷锤注: Array dereferencing 直译应为数组解除引用, 效果不佳其实更准确的翻译应为: 对函数返回结果的数组成员访问解析支持, 详见 PHP 官方解释
匿名函数中的 $this
现在, 你可以在类实例中通过 $this 引用一个匿名函数(也叫闭包函数)
代码如下:
- class Foo
- {
- function hello() {
- echo 'Hello Cichui!';
- }
- function anonymous()
- {
- return function() {
- $this->hello(); // 之前是不可能这么玩的
- };
- }
- }
- class Bar
- {
- function __construct(Foo $o) // object of class Foo typehint
- {
- $x = $o->anonymous(); // get Foo::hello()
- $x(); // execute Foo::hello()
- }
- }
- new Bar(new Foo); // Hello Cichui!
其实以前也能将就用, 就是有点费劲:
- function anonymous()
- {
- $that = $this; // $that is now $this
- return function() use ($that) {
- $that->hello();
- };
- }
无论 php.ini 中如何配置, short_open_tag, 也就是 替换以前的了
支持二进制直接量
八进制(oct), 前面加 0; 十六进制(hex), 前面加 0x; 二进制(bin), 现在在前面加 0b 就可以了
- echo 0b11111; // PHP 5.4 支持二进制了
- echo 31; // 十进制
- echo 0x1f; // 十六进制
- echo 037; // 八进制
函数类型提示
自 PHP 5.1 起, 类型提示支持对象和数组, PHP 5.4 开始支持 callable
代码如下:
- function my_function(callable $x)
- {
- return $x();
- }
- function my_callback_function(){return 'Hello Cichui!';}
- class Hello{static function hi(){return 'Hello Cichui!';}}
- class Hi{function hello(){return 'Hello Cichui!';}}
- echo my_function(function(){return 'Hello Cichui!';}); // 闭包函数
- echo my_function('my_callback_function'); // 回调函数
- echo my_function(['Hello', 'hi']); // 类名, 静态方法
- echo my_function([(new Hi), 'hello']); // 类名, 方法名
高精度计时器
此次引入了 $_SERVER['REQUEST_TIME_FLOAT']数组变量, 微秒级精度 (百万分之一秒, float 类型) 对于统计脚本运行时间会非常有用:
1echo 'Executed in', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2)
小结
总之, 此次 PHP 5.4 升级进行大量的改动 是时候升级了
来源: https://www.php1.cn/detail/php-bb0f93606f.html