zoukankan      html  css  js  c++  java
  • PHP5.4新特性

    PHP5.4 此次更新的关键新特性,包括:新增traits,更精简的Array数组语法,供测试使用的内建webserver,可以闭包使用的$this指针,实例化类成员访问,

    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了。

    Traits

    Traits (横向重用/多重继承)是一组结构很像“类”(但不能实例化)的方法,它可以让开发人员在不同的类中轻松地重用方法。 PHP为单继承语言,子类只能继承一个父类,于是Traits来了。

    1、Traits的最佳应用是多类之间可以共享相同的函数。打个比方,我们要做个网站,需要使用Facebook和Twitter的APIs。我们要建 2个类,如果是以前,我们需要写一个cURL的方法并且复制/粘贴到两个类中。现在不用了,使用Traits重用代码吧,这次真正地遵循了 DRY(Don’t Repeat Yourself)原则。

    /** cURL wrapper trait */
    trait cURL
    {
    public function curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); return $output; } } /** Twitter API Class */ class Twitter_API { use cURL; // use trait here public function get($url) { return json_decode($this->curl('http://api.twitter.com/'.$url)); } } /** Facebook API Class */ class Facebook_API { use cURL; // and here public function get($url) { return json_decode($this->curl('http://graph.facebook.com/'.$url)); } } $facebook = new Facebook_API(); echo $facebook->get('500058753')->name; // Rasmus Lerdorf /** Now demonstrating the awesomeness of PHP 5.4 syntax */ echo (new Facebook_API)->get('500058753')->name; $foo = 'get'; echo (new Facebook_API)->$foo('500058753')->name; echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name;

    看明白了吗?没有?那你来瞅瞅更简单的例子

    2、优先级:当前类中的方法会覆盖 Trait 方法,而Trait方法覆盖了基类中的方法。

    <?php
    trait HelloWorld {
        public function sayHello() {
            echo 'Hello World!';
        }
    }
    
    class TheWorldIsNotEnough {
        use HelloWorld;
        public function sayHello() {
            echo 'Hello Universe!';
        }
    }
    
    $o = new TheWorldIsNotEnough();
    $o->sayHello();
    //output Hello Universe!
    ?>

    3、多个Traits,使用use声明列出多个Traits。

    <?php
    trait Hello {
        public function sayHello() {
            echo 'Hello ';
        }
    }
    
    trait World {
        public function sayWorld() {
            echo 'World';
        }
    }
    
    class MyHelloWorld {
        use Hello, World;
        public function sayExclamationMark() {
            echo '!';
        }
    }
    
    $o = new MyHelloWorld();
    $o->sayHello();
    $o->sayWorld();
    $o->sayExclamationMark();
    //output Hello World!
    ?>

    4、冲突的解决:为了解决两个 Traits 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定冲突方法中的一个。由于这仅允许排除一个方法as 操作符可以将冲突的方法以另一个名称来引入。

    <?php
    trait A {
        public function smallTalk() {
            echo 'a';
        }
        public function bigTalk() {
            echo 'A';
        }
    }
    
    trait B {
        public function smallTalk() {
            echo 'b';
        }
        public function bigTalk() {
            echo 'B';
        }
    }
    
    class Talker {
        use A, B {
            B::smallTalk insteadof A;
            A::bigTalk insteadof B;
        }
    }
    
    class Aliased_Talker {
        use A, B {
            B::smallTalk insteadof A;
            A::bigTalk insteadof B;
            B::bigTalk as talk;
        }
    }
    ?>

    以上的smallTalk()都会输出b,bigTalk()会输出A。

    5、修改方法可见性:使用的类可以通过 as 语法来调整方法的可见性

    <?php
    trait HelloWorld {
        public function sayHello() {
            echo 'Hello World!';
        }
    }
    
    // Change visibility of sayHello
    class MyClass1 {
        use HelloWorld { sayHello as protected; }
    }
    
    // Alias method with changed visibility
    // sayHello visibility not changed
    class MyClass2 {
        use HelloWorld { sayHello as private myPrivateHello; }
    }
    ?>

    6、Traits组:其他 traits 也能够使用 traits,正如类能够使用 traits。 在 trait 定义时通过使用一个或多个 trait,它能够组合其他 traits 中的部分或全部成员。

    <?php
    trait Hello {
        public function sayHello() {
            echo 'Hello ';
        }
    }
    
    trait World {
        public function sayWorld() {
            echo 'World!';
        }
    }
    
    trait HelloWorld {
        use Hello, World;
    }
    
    class MyHelloWorld {
        use HelloWorld;
    }
    
    $o = new MyHelloWorld();
    $o->sayHello();
    $o->sayWorld();
    ?>

    上面会输出Hello world!

    7、抽象成员:为了对使用的类施加强制要求,Trait 支持抽象方法的使用。

    <?php
    trait Hello {
        public function sayHelloWorld() {
            echo 'Hello'.$this->getWorld();
        }
        abstract public function getWorld();
    }
    
    class MyHelloWorld {
        private $world;
        use Hello;
        public function getWorld() {
            return $this->world;
        }
        public function setWorld($val) {
            $this->world = $val;
        }
    }
    ?>

    8、Traits静态成员:静态变量可以被 trait 的方法引用,但不能被 trait 定义。但是 traits 能够为使用的类定义静态方法。

    Example #9 静态变量

    <?php
    trait Counter {
        public function inc() {
            static $c = 0;
            $c = $c + 1;
            echo "$c
    ";
        }
    }
    
    class C1 {
        use Counter;
    }
    
    class C2 {
        use Counter;
    }
    
    $o = new C1(); $o->inc(); // echo 1
    $p = new C2(); $p->inc(); // echo 1
    ?>

    Example #10 静态方法

    <?php
    trait StaticExample {
        public static function doSomething() {
            return 'Doing something';
        }
    }
    
    class Example {
        use StaticExample;
    }
    
    Example::doSomething();
    ?>

    9、属性:如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。 如果类的定义是兼容的(同样的可见性和初始值)则错误的级别是 E_STRICT,否则是一个致命错误。

    <?php
    trait PropertiesTrait {
        public $x = 1;
    }
    
    class PropertiesExample {
        use PropertiesTrait;
    }
    
    $example = new PropertiesExample;
    $example->x;
    ?>

    下面的例子出现了冲突

    <?php
    trait PropertiesTrait {
        public $same = true;
        public $different = false;
    }
    
    class PropertiesExample {
        use PropertiesTrait;
        public $same = true; // Strict Standards
        public $different = true; // Fatal error
    }
    ?>

    Buid-in web server

    PHP5.4内置了一个简单的Web服务器,这样在做一些简单程序就方便多了,省去了环境配置的工作,特别对于初学者来说。
    把当前目录作为Root Document只需要这条命令即可:

    $ php -S localhost:3300

    也可以指定其它路径:

    $ php -S localhost:3300 -t /path/to/root

    还可以指定路由:

    $ php -S localhost:3300 router.php

    Short array syntax

    PHP5.4提供了数组简短语法:

    $arr = [1,'james', 'james@fwso.cn'];

    Array dereferencing

    这个可是个好东西, 有了Array dereferencing, 以前的这种写法就再也不必要了:

    $arr = myfunc();
    echo $arr[1];

    在PHP5.4中这样就行了:

    echo myfunc()[1];

    Upload progress

    Session提供了上传进度支持,通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。

    参考:http://www.laruence.com/2011/10/10/2217.html

    JsonSerializable Interface
    实现了JsonSerializable接口的类的实例在json_encode序列化的之前会调用jsonSerialize方法,而不是直接序列化对象的属性。
    参考:http://www.laruence.com/2011/10/10/2204.html

    Use mysqlnd by default

    现在mysql, mysqli, pdo_mysql默认使用mysqlnd本地库,在PHP5.4以前需要:

    $./configure --with-mysqli=mysqlnd

    现在

    $./configure --with-mysqli

    完成。

  • 相关阅读:
    SQL常用单词
    Appium+python自动化获取toast消息的方法
    转:TCP/IP协议(一)网络基础知识
    【转】使用python实现appium的屏幕滑动
    JMETER java.net.SocketTimeoutException: Read timed out
    JMETER java.net.SocketException: Connection reset 报错解决方案
    Jmeter Distributed (Remote) Testing: Master Slave Configuration
    转:Jmeter分布式测试
    转:centos查看实时网络带宽占用情况方法
    Python类继承(转发)
  • 原文地址:https://www.cnblogs.com/zl0372/p/php_30.html
Copyright © 2011-2022 走看看