对于PHP 5.4 你必须要知道的


Posted in PHP onAugust 07, 2013

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升级进行大量的改动。 是时候升级了。
PHP 相关文章推荐
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
如何使用php实现评委评分器
Jul 31 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
Aug 30 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
laravel通过a标签从视图向控制器实现传值
Oct 15 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 PHP
php缓存技术详细总结
Aug 07 #PHP
IIS6.0中配置php服务全过程解析
Aug 07 #PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 #PHP
Win下如何安装PHP的APC拓展
Aug 07 #PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 #PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 #PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 #PHP
You might like
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
2018/08/05 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
python版本的读写锁操作方法
2016/04/25 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
CSS3混合模式mix-blend-mode/background-blend-mode简介
2018/03/15 HTML / CSS
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
创意广告词
2014/03/17 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
邀请函的格式
2015/01/30 职场文书
小学大队委竞选口号
2015/12/25 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Python中的tkinter库简单案例详解
2022/01/22 Python
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python