php5.5新特性及与php5.4的区别总结
现在,让我们来看看php5.5 可能会新增的功能:
1、放弃对windows xp和2003 的支持 2.弃用e修饰符 e修饰符是指示preg_replace函数用来评估替换字符串作为php代码,而不只是仅仅做一个简单的字符串替换。不出所料,这种行为会源源不断的出现安全问题。这就是为什么在php5.5 中使用这个修饰符将抛出一个弃用警告。作为替代,你应该使用preg_replace_callback函数。你可以从rfc找到更多关于这个变化相应的信息。
3.新增函数和类 boolval()
php已经实现了strval、intval和floatval的函数。为了达到一致性将添加boolval函数。它完全可以作为一个布尔值计算,也可以作为一个回调函数。
hash_pbkdf2()
pbkdf2全称“password-based key derivation function 2”,正如它的名字一样,是一种从密码派生出加密密钥的算法。这就需要加密算法,也可以用于对密码哈希。更广泛的说明和用法示例
array_column()
$usernames = array_column($users, 'name'); // is the same as $usernames = []; foreach ($users as $user) { $usernames[] = $user['name']; }
intl 扩展
将有许多改进 intl的扩展。例如,将会有新的intlcalendar,intlgregoriancalendar,intltimezone,intlbreakiterator,intlrulebasedbreakiterator,intlcodepointbreakiterator类。之前,我竟然不知道有这么多关于intl扩展,如果你想知道更多,我建议你去最新公告里找 calendar和 breakiterator。
4.一个简单的密码散列api $password = foo; // creating the hash $hash = password_hash($password, password_bcrypt); // verifying a password if (password_verify($password, $hash)) { // password correct! } else { // password wrong! }
5.新的语言特性和增强功能。 常量引用
“常量引用”意味着数组可以直接操作字符串和数组字面值。举两个例子:
function randomhexstring($length) { $str = ''; for ($i = 0; $i getfriends())将会抛出一个错误。作为php5.5 这将成为有效的代码
7.获取完整类别名称 php5.3 中引入命名空间的别名类和命名空间短版本的功能。虽然这并不适用于字符串类名称
use some\deeply\nested\namespace\foobar; // does not work, because this will try to use the global `foobar` class $reflection = new reflectionclass('foobar'); echo foobar::class;
为了解决这个问题采用新的foobar::class语法,它返回类的完整类别名称
8.参数跳跃 如果你有一个函数接受多个可选的参数,目前没有办法只改变最后一个参数,而让其他所有参数为默认值。
rfc上的例子,如果你有一个函数如下:
function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }
那么有没有办法设置$report_errors=false,而其他两个为默认值。为了解决这个跳跃参数的问题而提出:
create_query(deleted=0, name, default, default, false);
我个人不是特别喜欢这个提议。在我的眼睛里,代码需要这个功能,只是设计不当。函数不应该有12个可选参数。
9.标量类型提示 标量类型提示原本计划进入5.4,但由于缺乏共识而没有做。获取更多关于为什么标量类型提示没有做进php的信息,请参阅: 标量类型提示比你认为的更难。
对于php5.5 而言,针对标量类型提示讨论又一次出现,我认为这是一个相当不错的 提议。
它需要通过输入值来指定类型。例如:123,123.0,“123”都是一个有效的int参数输入,但“hello world”就不是。这与内部函数的行为一致。
function foo(int $i) { ... } foo(1); // $i = 1 foo(1.0); // $i = 1 foo(1); // $i = 1 foo(1abc); // not yet clear, maybe $i = 1 with notice foo(1.5); // not yet clear, maybe $i = 1 with notice foo([]); // error foo(abc); // error
10.getter 和 setter 如果你从不喜欢写这些getxyz()和setxyz($value)方法,那么这应该是你最受欢迎的改变。提议添加一个新的语法来定义一个属性的设置/读取:
seconds / 3600; } set { $this->seconds = $value * 3600; } } } $timeperiod = new timeperiod; $timeperiod->hours = 10; var_dump($timeperiod->seconds); // int(36000) var_dump($timeperiod->hours); // int(10)
当然还有更多的功能,比如只读属性。如果你想要知道更多,请参阅 rfc。
11.生成器 目前,自定义迭代器很少使用,因为它们的实现,需要大量的样板代码。生成器解决这个问题,并提供了一种简单的样板代码来创建迭代器。
例如,你可以定义一个范围函数作为迭代器:
firstname; }
也可以这样过滤数组:
$underageusers = [foreach ($users as $user) if ($user->age < 18) yield $user];
生成器表达式也很类似,但是返回一个迭代器(用于动态生成值)而不是一个数组。
13.finally关键字 这个和java中的finally一样,经典的try ... catch ... finally 三段式异常处理。
14.foreach 支持list() 对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。
$array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { echo a: $a; b: $b\n; }
15.增加了opcache扩展 使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。
16.非变量array和string也能支持下标获取了 echo array(1, 2, 3)[0];
echo [1, 2, 3][0];
echo foobar[2];