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# 不同,你不需要同时在声明和调用点指定按引用传递。
已有1条评论