1. 程式人生 > >php7 新特性整理

php7 新特性整理

Buid-in web server內建了一個簡單的Web伺服器

把當前目錄作為Root Document只需要這條命令即可:

php -S localhost:3300

也可以指定其它路徑

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

還可以指定路由

php -S localhost:3300 router.php

名稱空間(php5.3)

名稱空間的分隔符為反斜杆\

namespace fox\lanmps\Table;    
class Select {}

獲取完整類別名稱

PHP5.3 中引入名稱空間的別名類和名稱空間短版本的功能。雖然這並不適用於字串類名稱

use Some\Deeply\Nested\Namespace\FooBar;    
// does not work, because this will try to use the global `FooBar` class    
$reflection = new ReflectionClass('FooBar');   
echo FooBar::class;  

為了解決這個問題採用新的FooBar::class語法,它返回類的完整類別名稱

名稱空間 use 操作符開始支援函式和常量的匯入

namespace Name\Space {  
    const FOO = 42;  
    function
f() {
echo __FUNCTION__."\n"; } } namespace { use const Name\Space\FOO; use function Name\Space\f; echo FOO."\n"; f(); }

輸出
42
Name\Space\f

Group use declarations

從同一 namespace 匯入的類、函式和常量現在可以通過單個 use 語句 一次性匯入了。

//PHP7之前
use some\namespace\ClassA;
use some\namespace
\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP7之後 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};

支援延遲靜態繫結

static關鍵字來引用當前類,即實現了延遲靜態繫結

class A {    
    public static function who() {    
        echo __CLASS__;    
    }    
    public static function test() {    
        static::who(); // 這裡實現了延遲的靜態繫結    
    }    
}    
class B extends A {    
    public static function who() {    
         echo __CLASS__;    
    }    
}
B::test();    

輸出結果:
B

支援goto語句

多數計算機程式設計語言中都支援無條件轉向語句goto,當程式執行到goto語句時,即轉向由goto語句中的標號指出的程式位置繼續執行。儘管goto語句有可能會導致程式流程不清晰,可讀性減弱,但在某些情況下具有其獨特的方便之處,例如中斷深度巢狀的迴圈和 if 語句。

goto a;    
echo 'Foo';    
a:    
echo 'Bar';    
for($i=0,$j=50; $i<100; $i++) {    
  while($j--) {    
    if($j==17) goto end;    
  }     
}    
echo "i = $i";    
end:    
echo 'j hit 17'; 

支援閉包、Lambda/Anonymous函式

閉包(Closure)函式和Lambda函式的概念來自於函式程式設計領域。例如JavaScript 是支援閉包和 lambda 函式的最常見語言之一。
在PHP中,我們也可以通過create_function()在程式碼執行時建立函式。但有一個問題:建立的函式僅在執行時才被編譯,而不與其它程式碼同時被編譯成執行碼,因此我們無法使用類似APC這樣的執行碼快取來提高程式碼執行效率。
在PHP5.3中,我們可以使用Lambda/匿名函式來定義一些臨時使用(即用即棄型)的函式,以作為array_map()/array_walk()等函式的回撥函式。

echo preg_replace_callback('~-([a-z])~', function ($match) {    
    return strtoupper($match[1]);    
}, 'hello-world');    
// 輸出 helloWorld    
$greet = function($name)    
{    
    printf("Hello %s\r\n", $name);    
};    
$greet('World');    
$greet('PHP');    
//...在某個類中    
$callback =      function ($quantity, $product) use ($tax, &$total)         {    
   $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));    
   $total += ($pricePerItem * $quantity) * ($tax + 1.0);    
 };    

魔術方法__callStatic()和__invoke()

PHP中原本有一個魔術方法__call(),當代碼呼叫物件的某個不存在的方法時該魔術方法會被自動呼叫。新增的__callStatic()方法則只用於靜態類方法。當嘗試呼叫類中不存在的靜態方法時,__callStatic()魔術方法將被自動呼叫。

class MethodTest {    
    public function __call($name, $arguments) {    
        // 引數 $name 大小寫敏感    
        echo "呼叫物件方法 '$name' "    
             . implode(' -- ', $arguments). "\n";    
    }    
    /**  PHP 5.3.0 以上版本中本類方法有效  */    
    public static function __callStatic($name, $arguments) {    
        // 引數 $name 大小寫敏感    
        echo "呼叫靜態方法 '$name' "    
             . implode(' -- ', $arguments). "\n";    
    }    
}    

$obj = new MethodTest;    
$obj->runTest('通過物件呼叫');    
MethodTest::runTest('靜態呼叫');  // As of PHP 5.3.0

以上程式碼執行後輸出如下:
呼叫物件方法’runTest’ –- 通過物件呼叫呼叫靜態方法’runTest’ –- 靜態呼叫
以函式形式來呼叫物件時,__invoke()方法將被自動呼叫。

class MethodTest {    
    public function __call($name, $arguments) {    
        // 引數 $name 大小寫敏感    
        echo "Calling object method '$name' "    
             . implode(', ', $arguments). "\n";    
    }    

    /**  PHP 5.3.0 以上版本中本類方法有效  */    
    public static function __callStatic($name, $arguments) {    
        // 引數 $name 大小寫敏感    
        echo "Calling static method '$name' "    
             . implode(', ', $arguments). "\n";    
    }    
}    
$obj = new MethodTest;    
$obj->runTest('in object context');    
MethodTest::runTest('in static context');  // As of PHP 5.3.0  

Nowdoc語法

用法和Heredoc類似,但使用單引號。Heredoc則需要通過使用雙引號來宣告。
Nowdoc中不會做任何變數解析,非常適合於傳遞一段PHP程式碼。

// Nowdoc 單引號 PHP 5.3之後支援    
$name = 'MyName';    
echo <<<'EOT'    
My name is "$name".    
EOT;    
//上面程式碼輸出 My name is "$name". ((其中變數不被解析)    
// Heredoc不加引號    
echo <<<FOOBAR    
Hello World!    
FOOBAR;    
//或者 雙引號 PHP 5.3之後支援    
echo <<<"FOOBAR"    
Hello World!    
FOOBAR;  

支援通過Heredoc來初始化靜態變數、類成員和類常量。

// 靜態變數    
function foo()    
{    
    static $bar = <<<LABEL    
Nothing in here...    
LABEL;    
}    
// 類成員、常量    
class foo    
{    
    const BAR = <<<FOOBAR    
Constant example    
FOOBAR;    

    public $baz = <<<FOOBAR    
Property example    
FOOBAR;    
}  

在類外也可使用const來定義常量

//PHP中定義常量通常是用這種方式  
define("CONSTANT", "Hello world.");  

//並且新增了一種常量定義方式  
const CONSTANT = 'Hello World'; 

三元運算子增加了一個快捷書寫方式

原本格式為是(expr1) ? (expr2) : (expr3)
如果expr1結果為True,則返回expr2的結果。
新增一種書寫方式,可以省略中間部分,書寫為expr1 ?: expr3
如果expr1結果為True,則返回expr1的結果

$expr1=1;
$expr2=2;
//原格式  
$expr=$expr1?$expr1:$expr2  
//新格式  
$expr=$expr1?:$expr2

輸出結果:
1
1

空合併運算子(??)

簡化判斷

$param = $_GET['param'] ?? 1;

相當於:

$param = isset($_GET['param']) ? $_GET['param'] : 1;

Json更懂中文(JSON_UNESCAPED_UNICODE)

echo json_encode("中文", JSON_UNESCAPED_UNICODE);  
//輸出:"中文" 

二進位制

$bin  = 0b1101;  
echo $bin;  
//13 

Unicode codepoint 轉譯語法

這接受一個以16進位制形式的 Unicode codepoint,並打印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字串。 可以接受任何有效的 codepoint,並且開頭的 0 是可以省略的。

 echo "\u{9876}"

舊版輸出:\u{9876}
新版輸入:頂

使用 ** 進行冪運算

加入右連線運算子* 來進行冪運算。 同時還支援簡寫的 *= 運算子,表示進行冪運算並賦值。

printf("2 ** 3 ==      %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);

$a = 2;
$a **= 3;
printf("a ==           %d\n", $a);

輸出
2 ** 3 == 8
2* 3 *2 == 512
a == 8

太空船操作符(組合比較符)

太空船操作符用於比較兩個表示式。當ab 時它分別返回 -1 、 0 或 1 。 比較的原則是沿用 PHP 的常規比較規則進行的。

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

Traits

Traits提供了一種靈活的程式碼重用機制,即不像interface一樣只能定義方法但不能實現,又不能像class一樣只能單繼承。至於在實踐中怎樣使用,還需要深入思考。
魔術常量為TRAIT

官網的一個例子:  
trait SayWorld {  
        public function sayHello() {  
                parent::sayHello();  
                echo "World!\n";  
                echo 'ID:' . $this->id . "\n";  
        }  
}  

class Base {  
        public function sayHello() {  
                echo 'Hello ';  
        }  
}  

class MyHelloWorld extends Base {  
        private $id;  

        public function __construct() {  
                $this->id = 123456;  
        }  

        use SayWorld;  
}  

$o = new MyHelloWorld();  
$o->sayHello();  

/*will output: 
Hello World! 
ID:123456 
 */  

array 陣列簡寫語法

$arr = [1,'james', '[email protected]'];  
$array = [  
  "foo" => "bar",  
  "bar" => "foo"  
  ]; 

array 陣列中某個索引值簡寫

function myfunc() {  
    return array(1,'james', '[email protected]');  
}
echo myfunc()[1];  

$name = explode(",", "Laruence,male")[0];  
explode(",", "Laruence,male")[3] = "phper";  

非變數array和string也能支援下標獲取了

echo array(1, 2, 3)[0];  
echo [1, 2, 3][0];  
echo "foobar"[2];  

支援為負的字串偏移量

現在所有接偏移量的內建的基於字串的函式都支援接受負數作為偏移量,包括陣列解引用操作符([]).

var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

以上例程會輸出:

string (1) "e"
int(3)

常量引用

“常量引用”意味著陣列可以直接操作字串和陣列字面值。舉兩個例子:

function randomHexString($length) {    
    $str = '';    
    for ($i = 0; $i < $length; ++$i) {    
        $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string    
    }    
}    
function randomBool() {    
    return [false, true][mt_rand(0, 1)]; // direct dereference of array    
}   

常量增強

允許常量計算,允許使用包含數字、字串字面值和常量的標量表達式

const A = 2;  
const B = A + 1;  
class C  
{  
    const STR = "hello";  
    const STR2 = self::STR + ", world";  
}

允許常量作為函式引數預設

function test($arg = C::STR2)

類常量可見性
現在起支援設定類常量的可見性。


            
           

相關推薦

php7 特性整理

Buid-in web server內建了一個簡單的Web伺服器 把當前目錄作為Root Document只需要這條命令即可: php -S localhost:3300 也可以指定其它路徑 php -S localhost:3300 -t /path/to/root 還可以指定路由

php7特性的理解和比較

int 大於 spl dep csp sco 對象 vat empty 1. null合並運算符(??) ??語法: 如果變量存在且值不為NULL,它就會返回自身的值,否則返回它的第二個操作數. 1 //php7以前 if判斷 2 if(empty($_GE

C++11以上的特性整理

1、nullptr void foo(char *); void foo(int);foo(NULL) //編譯出錯,不知道呼叫哪個,可能呼叫了foo(int)foo(nullptr) //ok ,呼叫foo(char*)//用nullptr替換原先的NULL 2、constexpr

Java8特性整理之流的介紹與使用

Java8新特性整理之流的介紹與使用   流是什麼 官方定義:支援順序和並行聚合操作的元素序列。 這裡有幾個關鍵詞,順序、並行、聚合、元素序列。 所謂順序就是單執行緒順序執行,並行就是多執行緒分解執行,聚合就是將順序或並行執行的結果計算後得出最終結果,元素序列則是將資料

Java8特性整理之方法引用

Java8新特性整理之方法引用 方法引用語法 目標引用 ::方法的名稱 1 例子 擷取字串的Lambda表示式 (str, i) -> str.substring(i) 1 等效的方法引用 String::substring

Java8特性整理之CompletableFuture

Java8新特性整理之CompletableFuture:組合式、非同步程式設計   使用CompletableFuture構建非同步應用 Future 介面的侷限性 Future介面可以構建非同步應用,但依然有其侷限性。它很難直接表述多個Future 結果之間的依賴性。實

Java8特性整理之Optional取代Null引用

Java8新特性整理之Optional取代Null引用   版權宣告:歡迎轉載!請註明出處! https://blog.csdn.net/u011726984/article/details/79315837 java8之前如何避免空指標異常 相信大家在開發中都會碰到Nul

Java8特性整理之介面的預設方法

Java8新特性整理之介面的預設方法 預設方法 預設方法由default修飾符修飾,並像類中宣告的其他方法一樣包含方法體。 比如,你可以像下面這樣在集合庫中定義一個名為Sized的介面,在其中定義一個抽象方法size,以及一個預設方法isEmpty: public interface

Java8特性整理之構建流的方式

Java8新特性整理之構建流的方式 流的建立方式 由值建立流 你可以使用靜態方法Stream.of,通過顯式值建立一個流。它可以接受任意數量的引數。 Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In

PHP7特性 What will be in PHP 7/PHPNG

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

php7特性(二):面向物件部分

1)、PHP 7 支援new class 來例項化一個匿名類這可以用來替代一些"用後即焚"的完整類定義。 2)、Closure::call():將一個閉包函式動態繫結到一個新的物件例項並呼叫執行該函式 3)、use:可以使用一個 use 從同一個 namespace 中匯入類、函

php7特性學習

1、標量型別宣告 在函式/方法的引數及返回值處宣告資料型別為某個具體的資料型別,則必須傳入或返回對應的資料型別,否則會報錯。 function inputint(int $a) { echo $a; } function returnArray(): array {

laravel 框架與 php7 特性

laravel 框架的優缺點 優點 社群非常活躍 Laravel 的設計思想是很先進的,非常適合應用各種開發模式。 0. laravel框架中 服務容器是整個系統功能排程配置的核心,在系統執行過程中動態的為系統提供需要的服務 從而實現瞭解耦 0. 服務提供者是所有 La

Android5.0,6.0,7.0,8.0特性整理

背景 Android5.0(Android Lollipop)是谷歌公司2014年10月釋出的全新安卓系統,至今已經兩年多。然而由於國產手機對安卓ROM的深度定製或修改,以及手機廠商、晶片製造商、運營商之間錯綜複雜的關係,我們更新最新安卓版本往往需要1年左右時間的等待。

JDK1.5,1.6,1.7,1.8,1.9的特性整理

目錄 7、執行緒池 jdk1.5新特性(2004年10月釋出) 1.泛型2.for

trait,interface,abstract,PHP7特性以及PHP閉包學習

1月8日trait 自PHP5.4.0起,PHP實現了一種程式碼複用的方法 稱為traittrait 是為 PHP這類單繼承語言準備的一種程式碼複用機制 。trait 為了減少單繼承語言的限制,使開發者可以在不同層級中獨立的呼叫 trait中的 方法 trait和類的組合使用,避免了一般類的多繼承和混入類(M

Android5.0,6.0,7.0特性整理

背景 Android5.0(Android Lollipop)是谷歌公司2014年10月釋出的全新安卓系統,至今已經兩年多。然而由於國產手機對安卓ROM的深度定製或修改,以及手機廠商、晶片製造商、運營商之間錯綜複雜的關係,我們更新最新安卓版本往往需要1年左右時

Java8特性整理之方法引用(二)

方法引用語法 目標引用 ::方法的名稱 例子 擷取字串的Lambda表示式 (str, i) -> str.substring(i) 等效的方法引用 String::

PHP7特性--標量型別宣告

標量型別宣告 PHP 7 中的函式的形參型別宣告可以是標量了。在 PHP 5 中只能是類名、介面、array 或者 callable (PHP 5.4,即可以是函式,包括匿名函式),現在也可以使用 string、int、float和 bool

PHP7中我們應該學習會用的特性

默認 很多 處理 strong 支持 體驗 int 補充 urn PHP7於2015年11月正式發布,本次更新可謂是PHP的重要裏程碑,它將帶來顯著的性能改進和新特性,並對之前版本的一些特性進行改進。本文小編將和大家一起來了解探討PHP7中的新特性。 1. 標量類型聲明 我