2.PHP 5.4中的新特性
2.1.PHP 5.4中的新特性
2.1.1. Buid-in web server内置了一个简单的Web服务器
把当前目录作为Root Document只需要这条命令即可:
- $ php -S localhost:3300
也可以指定其它路径:
- $ php -S localhost:3300 -t /path/to/root
还可以指定路由:
- $ php -S localhost:3300 router.php
2.1.2.Traits
Traits提供了一种灵活的代码重用机制,即不像interface一样只能定义方法但不能实现,又不能像class一样只能单继承。至于在实践中怎样使用,还需要深入思考。魔术常量为__TRAIT__
- 官网的一个例子:
- trait SayWorld {
- public function sayHello() {
- parent::sayHello();
- echo “World!\n”;
- echo ‘ID:’ . $this->id . “\n”;
- }
- }
- class Base {
- public function sayHello() {
- echo ‘Hello ‘;
- }
- }
- class MyHelloWorld extends Base {
- private $id;
- public function __construct() {
- $this->id = 123456;
- }
- use SayWorld;
- }
- $o = new MyHelloWorld();
- $o->sayHello();
- /*will output:
- Hello World!
- ID:123456
- */
2.1.3. Short array syntax 数组简短语法
- $arr = [1,'james', 'james@fwso.cn'];
- $array = [
- "foo" => "bar",
- "bar" => "foo"
- ];
2.1.4. Array dereferencing 数组值
- function myfunc() {
- return array(1,‘james’, ‘james@fwso.cn’);
- }
我认为比数组简短语法更方便的是dereferencing,以前我们需要这样:
- $arr = myfunc();
- echo $arr[1];
在PHP5.4中这样就行了:
- $name = explode(“,”, “Laruence,male”)[0];
- explode(“,”, “Laru
- echo myfunc()[1];
其他:
- $name = explode(“,”, “Laruence,male”)[0];
- explode(“,”, “Laruence,male”)[3] = “phper”;
本例要注意一个要点 http://www.laruence.com/2011/12/19/2409.html
2.1.5. Upload progress 文件上传
Session提供了上传进度支持,通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
详细的看http://www.laruence.com/2011/10/10/2217.html
2.1.6. JsonSerializable Interface [JSON 序列化对象]
实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。
参考http://www.laruence.com/2011/10/10/2204.html
2.1.7. Use mysqlnd by default
现在mysql, mysqli, pdo_mysql默认使用mysqlnd本地库,在PHP5.4以前需要:
- $./configure –with-mysqli=mysqlnd
现在
- $./configure –with-mysqli
以上来自:http://www.hdj.me/php54
2.1.8.实例化类
- class test{
- function show(){
- return ‘test’;
- }
- }
- echo (new test())->show();
2.1.9.支持 Class::{expr}() 语法
- foreach ([new Human("Gonzalo"), new Human("Peter")] as $human) {
- echo $human->{‘hello’}();
- }
2.1.10.Callable typehint
则:
- function foo(callable $callback) {
- }
- foo(“false”); //错误,因为false不是callable类型
- foo(“printf”); //正确
- foo(function(){}); //正确
- class A {
- static function show() {
- }
- }
- foo(array(“A”, “show”)); //正确
2.1.11.函数类型提示的增强
由于php是弱类型的语言,因此在php 5.0后,引入了函数类型提示的功能,其含义为对于传入函数中的参数都进行类型检查,举个例子,有如下的类:
- class bar {
- function foo(bar $foo) {
- }
- //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:
- function foo(array $foo) {
- }
- }
- foo(array(1, 2, 3)); // 正确,因为传入的是数组
- foo(123); // 不正确,传入的不是数组
2.1.12.新增加了$_SERVER["REQUEST_TIME_FLOAT"]
这个是用来统计服务请求时间的,并用ms来表示
- echo “脚本执行时间 “, round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), “s”;
2.1.13. 让Json更懂中文(JSON_UNESCAPED_UNICODE)
- echo json_encode(“中文”, JSON_UNESCAPED_UNICODE);
- //”中文”
2.1.14. 二进制直接量(binary number format)
- $bin = 0b1101;
- echo $bin;
- //13
2.2 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了。
删除的特性
最后,我们集中整理了几年来标记为已弃用的多个特性。这些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat42、session.bug_compat_warn 以及 y2k_compliance。
除了这些特性之外,magic_quotes 可能是最大的危险。在早期版本中,未考虑因 magic_quotes 出错导致的后果,简单编写且未采取任何举措使自身免受 SQL 注入攻击的应用程序都通过 magic_quotes 来保护。如果在升级到 PHP 5.4 时未验证已采取正确的 SQLi 保护措施,则可能导致安全漏洞。
其他改动和特性
有一种新的“可调用的”类型提示,用于某方法采用回调作为参数的情况。
htmlspecialchars() 和 htmlentities() 现在可更好地支持亚洲字符,如果未在 php.ini 文件中显式设置 PHP default_charset,这两个函数默认使用 UTF-8 而不是 ISO-8859-1。
会话 ID 现在默认通过 /dev/urandom(或等效文件)中的熵生成,而不是与早期版本一样成为必须显式启用的一个选项。
mysqlnd 这一捆绑的 MySQL 原生驱动程序库现在默认用于与 MySQL 通信的各种扩展,除非在编译时通过 ./configure 被显式覆盖。
可能还有 100 个小的改动和特性。从 PHP 5.3 升级到 5.4 应该极为顺畅,但请阅读迁移指南加以确保。如果您从早期版本升级,执行的操作可能稍多一些。请查看以前的迁移指南再开始升级。
2.3.PHP5.4弃用功能
备受指责的 Register Globals 已从 PHP 中完全删除。十年来,该特性一直以其频繁发生的安全漏洞而著称。2002年该特性被设置为默认关闭。2009年发布的 PHP5.3 将该特性标记为“弃用”,想必从那时起,大部分开发人员已经不再使用它。
从 PHP 中移除的另一个不讨喜的特性是 Magic Quotes。Magic Quotes 本意是对字符串进行自动转义(escape)以试图避免 SQL 注入攻击。但是由于字符串的转义使用方法常与特定背景相关,因此,比起试图解决的问题,它反而造成了更多的问题。该特性同 Register Globals 一样,也在 2009 年被标记为“弃用”。
PHP 中的 break 和 continue 语句之后可以跟上一个参数用来指明跳出的循环层数。如果不指定参数,它会像 VB、C#或 Java 一样跳出最内层的循环。在 PHP 5.4 之前,开发人员可以向 break 语句传递一个变量,而现在只能传递常量。
PHP 允许参数按引用传递。在早期版本中,你可以通过为调用点添加修饰来指明变量按引用传递。在 PHP 5.4 中,该选项已被移除。相反,现代 PHP 编程只需要在函数声明时指定按引用传递即可。与 C# 不同,你不需要同时在声明和调用点指定按引用传递。