对于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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
初级的用php写的采集程序
Mar 16 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
Mar 09 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
PHP递归实现层级树状展开
Apr 01 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
Laravel 添加多语言提示信息的方法
Sep 29 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
php 获取select下拉列表框的值
2010/05/08 PHP
php中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
js获取单选按钮的数据
2006/11/27 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
JS判定是否原生方法
2013/07/22 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
2016/03/05 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
Python 内置函数complex详解
2016/10/23 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
霸气队列口号
2014/06/18 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
思想品德课教学反思
2016/02/24 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python