1.命名空间:
命名空间是一种封装事物的方法。最容易理解的例子就是操作系统的文件夹目录,每个 目录都可能有相同的文件名和后缀的文件,用文件夹分别保存就能防止同名冲突。命名空间 也是这个作用,当项目越发庞杂时,或者引入多个第三方程序,类也会逐渐变多,不可避免 会出现类名冲突等问题。
创建第一个有命名空间的类
<?php namespace demo1; class Demo { public function index() { return 'Demo1'; } }
创建第二个有命名空间的类
<?php namespace demo2; class Demo { public function index() { return 'Demo2'; } }
引入两个相同冲突的类
方式1:
<?php require 'demo1.php'; require 'demo2.php'; $demo = new \demo1\Demo(); echo $demo->index(); //Demo1 $demo2 = new \demo2\Demo(); echo $demo2->index(); //Demo2
方式2:
<?php require 'demo1.php'; require 'demo2.php'; use demo1\Demo; $demo = new Demo(); echo $demo->index(); //Demo1 $demo2 = new \demo2\Demo(); echo $demo2->index(); //Demo2
2.goto 操作符
Goto 语句曾经颇受争议,因为它会让程序的可读性大大降低而变得不可维护。但经过 PHP 维护者们长时间的考量,如果是合理使用还是非常方便。
注意:对于初学者,还是尽可能少用或不用 goto 语句。
<?php for ($i = 0; $i < 100; $i++) { if ($i == 20) goto end; //$i==20直接跳到end:标志处 } echo '我永远无法执行到!'; end: echo $i;
3.简写的三元运算符
以往的三元运算符必须写全,导致有时需要不必要的填充来满足语法要求。现在有了简 写形式就不需要那么麻烦了,直接?:即可。
<?php $result = false; echo $result ?: 'error'; //error $result = true; echo $result ?:'error'; //1 //以前的做法 $result = true; echo $result ? $result : 'error'; //1
4.全局变量用 const 代替 define()
<?php //以前的写法 define('NAME', 'zhou'); echo NAME; //zhou //新写法 const AGE = 26; echo AGE; //26
5.支持匿名函数/闭包
匿名函数是 JavaScript 里面一个非常重要的一种格式,现在 PHP 也支持匿名函数,将极 大的提升了开发的灵活性。
匿名函数:
<?php //匿名函数的使用 $people = function($name) { return $name; }; echo $people('周');
闭包:
<?php //闭包函数的使用 $city = '自贡'; $age = 100; $people = function($name) use ($city,$age){ return $name.$city.$age; }; echo $people('admin');
6.新增的魔术方法__callstatic()
在调用类的方法时(包括静态方法和非静态方法),如果不存在这个方法就会报错。通过 __call()可以判断非静态方法,__callstatic()可以判断静态方法。
<?php class Demo { public function __call($name, $arguments) { echo $name; //abc print_r($arguments); //Array ( [0] => 1 [1] => 2 [2] => 3 ) } public static function __callStatic($name, $arguments) { echo $name; //def print_r($arguments); //Array ( [0] => 4 [1] => 5 [2] => 6 ) } } $demo = new Demo(); $demo->abc(1,2,3); Demo::def(4,5,6);
7.新增的魔术方法__invoke()
这个魔术方法,可以在实例化后,直接将实例对象当作函数直接运行。
<?php class Demo { public function __invoke($param1,$param2) { return $param1.$param2; } } $demo = new Demo(); echo $demo('你好', '世界!');
8.动态调用静态方法
我们可以把静态方法通过字符串赋值给一个变量,然后用对象调用这个变量即可执行这个方法。
<?php class Demo { public static function index() { return 'index'; } } $fn = 'index'; echo Demo::$fn(); //index
9.延迟静态绑定
在类继承上,增加了一个后期静态绑定的功能。以往只能使用 self::来前期绑定,导致无法得到后期的结果。
前期self
<?php class A { public static function index() { echo __CLASS__; } public static function test() { self::index(); } } class B extends A { public static function index() { echo __CLASS__; } } B::test(); //A
后期static
<?php class A { public static function index() { echo __CLASS__; } public static function test() { static::index(); } } class B extends A { public static function index() { echo __CLASS__; } } B::test(); //B
10.nowdoc 字符串结构
目前有三种字符串声明方式,分别是单引号、双引号和 heredoc 结构。而 heredoc 结构 可以转义变量,所以现在提供了 nowdoc 结构忽略转义变量。
<?php //heredoc $name = 'Zhou'; $str = <<< EOD He is Mr. $name EOD; echo $str; //He is Mr. Zhou //nowdoc $name = 'Zhou'; $str = <<< 'EOD' He is Mr. $name EOD; echo $str; //He is Mr. $name
11.json 强制转换为对象
json_encode()方法之前只能转换成数组,现在可以强制转换为对象形式。这样得到的 数据,在页面上处理将更加方便。
<?php $arr = array(1,2,3); echo json_encode($arr); //[1,2,3] echo json_encode($arr, JSON_FORCE_OBJECT); //{"0":1,"1":2,"2":3}
关于更多 PHP5.3 新特性内容,请访问官网手册:
http://www.php.net/manual/zh/migration53.new-features.php