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