美文网首页
PHP7 新特性

PHP7 新特性

作者: DukeAnn | 来源:发表于2017-08-28 22:34 被阅读0次

    类型声明

    看代码,一目了然了。

    class person
    {
        public function age(int $age) : string
        {
            return 'Age is ' . $age;
        }
    }
    

    命名空间与use关键字批量声明

    非混合模式

    use Publishers\Packt\{ Book, Ebook, Video};
    use function Publishers\Packt\{ getBook, saveBook };
    use const Publishers\Packt\{ COUNT, KEY };
    

    混合模式

    use Publishers\Packt\{
        Book,
        Ebook,
        Video,
        function getBook,
        function saveBook,
        const COUNT,
        const KEY
    };
    

    复合模式

    use Publishers\Packt\{
        Paper\Book,
        Electronic\Ebook,
        Media\Video
    };
    

    匿名类

    匿名类的声明与使用时同时进行的,具备其他类所具备的所以功能,区别在于匿名类没有类名。语法如下:

    new class(argument) { definition };
    

    匿名类是没有类名的,但在PHP内部,会在内存的引用地址表中为其分配一个全局唯一的名称。

    $name = new class('You') {
        public function __construct($name)
        {
            echo $name;
        }
    };
    

    匿名类可以继承父类及父类的方法

    class Packt
    {
        protected $number;
    
        public function __construct()
        {
            echo 'parent construct';
        }
    
        public function getNumber() : float
        {
            return $this->number;
        }
    }
    
    $number = new class(5) extends Packt
    {
        public function __construct(float $number)
        {
            parent::__construct();
            $this->number = $number;
        }
    };
    
    echo $number->getNumber();
    

    匿名类可以继承接口

    interface Publishers
    {
        public function __construct(string name, string address);
        public function getName();
        public function getAddress();
    }
    
    class packt
    {
        protected $number;
        protected $name;
        protected $address;
        public function ...
    }
    
    $info = new class('name', 'address') extends Packt implement Publishers
    {
        public function __construct(string $name, string $address)
        {
            $this->name = $name;
            $this->address = $address;
        }
    
        public function getName() : string
        {
            return $this->name;
        }
    
        public function getAddress() : string
        {
            return $this->address;
        }
    }
    
    echo $info->getName() . ' ' . $info->getAddress();
    

    匿名类可以嵌套在一个类中使用

    class Math
    {
        public $first_number = 10;
        public $second_number = 10;
        public function add() : float
        {
            return $this->first_number + $this->second_number;
        }
    
        public function mutiply_sum()
        {
            return new class() extends Math
            {
                public function mutiply(float $third_number) : float
                {
                    return $this->add() * $third_number;
                }
            };
        }
    }
    
    $math = new Math();
    echo $math->mutiply_sum()->mutiply(2);
    

    摒弃老式构造函数

    从PHP4开始,构造函数可以通过命名与类名一致的方式来声明自己是构造函数,在PHP7中这种方式声明构造函数依然可以使用,但不推荐使用,会输出不推荐的信息 Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Packt has a deprecated constructor in ...,PHP7中推荐使用 __construct()

    throwable接口

    从PHP7开始,程序中的fatal错误都可以被截获,PHP7提供了 throwable 接口,异常与错误都继承于这个接口。

    Error

    现在大多数的 fatal 错误情况会抛出一个 error 实例,类似于截获异常,error 实例可以被 try/catch 截获。

    try
    {
        ...
    } catch(Error $e)
    {
        echo $e->getMessage();
    }
    

    一些错误情况只有 error 的子实例会被抛出,例如 TypeErrorDivisionByZeroErrorParseError 等。

    操作符

    <=> 操作符将==<> 三个比较操作符打包在了一起,具体使用规则如下。

    操作符两边相等时返回 0
    操作符左边小于右边时返回 -1
    操作符左边大于右边时返回 1

    null合并运算符

    ?? 合并运算符,在第一操作数存在时可被直接返回,否则返回第二操作数。

    $title = $post['title'] ?? NULL;
    $title = $post['title'] ?? $get['title'] ?? 'No title';
    

    uniform变量语法

    $first = ['name' => 'second'];
    $second = 'two';
    echo $$first['name'];
    echo ${$first['name']}; // PHP7
    ...
    echo $object->$methods['title'];
    echo $object->{$methods['title']}; // PHP7
    

    主要是因为PHP7与之前版本PHP的解析方式不一样,在PHP7中加上花括号就可以啦,就像上边代码这样,否则会报错。

    常量数组

    从PHP5.6开始常量数组可以用const关键字来声明,在PHP7中常量数组可以通过define函数来初始化。

    const STORES = ['en', 'fr', 'ar']; // php5.6
    define('STORES', ['en', 'fr', 'ar']); // php7
    

    switch中的default默认值

    在PHP7之前,switch语句中允许多个default默认值,从PHP7开始,只能有一个default默认值,否则会产生fatal级别错误。

    // php7之前
    switch (true) {
        case 'value':
            # code...
            break;
        default:
            # code...
            break;
        default:
            # code...
            break;
    }
    
    // php7
    switch (true) {
        case 'value':
            # code...
            break;
        default:
            # code...
            break;
    }
    

    session_start 函数中的选项数组

    在PHP7之前,使用session的时候都必须先调用session_start()函数,且这个函数并没有参数需要传递,所有session相关的配置都在php.ini文件中,从PHP7开始,可以在调用这个函数时传递参数选项数组,这些设置信息将覆盖php.ini中的session配置。

    session_start([
        'cookie_lifetime' => 3600,
        'read_and_close' => true
    ]);
    

    unserialize 函数引入过滤器

    unserialize() 可以反序列化任何类型的对象,没有任何过滤项,不安全,PHP7在 unserialize() 中引入了过滤器,且默认允许反序列化所有类型的对象。

    $result = unserialize($object, ['allowed_classes' => ['Book', 'Ebook']]);
    

    相关文章

      网友评论

          本文标题:PHP7 新特性

          本文链接:https://www.haomeiwen.com/subject/krlndxtx.html