将心比心,方得人心~

PHP5.3 提供了非常有用的新特性以方便开发者使用。

周洲 2017-04-06 20:55:56

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


打赏

『微信打赏』

Tag标签php 

我是有底线的