首頁  >  文章  >  後端開發  >  整合PHP5.X到PHP7.1.x的特性

整合PHP5.X到PHP7.1.x的特性

coldplay.xixi
coldplay.xixi轉載
2021-01-20 09:47:511661瀏覽

整合PHP5.X到PHP7.1.x的特性

推薦(免費):PHP7

#這麼多好的特性,好的方法,為什麼不用呢,也希望PHP越來越好。
在這裡整理PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP5.5,PHP5.6 ,PHP7,PHP7.1 所有新特性,已備大家學習及使用

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 &#39;j hit 17&#39;;

支援閉包、Lambda/Anonymous函數

#閉包(Closure)函數和Lambda函數的概念來自於函數程式設計領域。例如JavaScript 是支援閉包和 lambda 函數的最常見語言之一。

在PHP中,我們也可以透過create_function()在程式碼執行時建立函數。但有一個問題:創建的函數僅在運行時才被編譯,而不與其它程式碼同時被編譯成執行碼,因此我們無法使用類似APC這樣的執行碼快取來提高程式碼執行效率。
在PHP5.3中,我們可以使用Lambda/匿名函數來定義一些暫時使用(即用即棄型)的函數,以作為array_map()/array_walk()等函數的回呼函數。

echo preg_replace_callback(&#39;~-([a-z])~&#39;, function ($match) {    
    return strtoupper($match[1]);    
}, &#39;hello-world&#39;);    
// 输出 helloWorld    $greet = function($name)    {    
    printf("Hello %s\r\n", $name);    
};    
$greet(&#39;World&#39;);    
$greet(&#39;PHP&#39;);    
//...在某个类中    $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 "调用对象方法 &#39;$name&#39; "    
             . implode(&#39; -- &#39;, $arguments). "\n";    
    }    
    /**  PHP 5.3.0 以上版本中本类方法有效  */    
    public static function __callStatic($name, $arguments) {    
        // 参数 $name 大小写敏感    
        echo "调用静态方法 &#39;$name&#39; "    
             . implode(&#39; -- &#39;, $arguments). "\n";    
    }    
}    

$obj = new MethodTest;    
$obj->runTest(&#39;通过对象调用&#39;);    
MethodTest::runTest(&#39;静态调用&#39;);  // As of PHP 5.3.0

以上程式碼執行後輸出如下:

呼叫物件方法'runTest' –- 透過物件呼叫呼叫靜態方法'runTest' –- 靜態呼叫
以函數形式來呼叫物件時,__invoke ()方法將會自動呼叫。

class MethodTest {    
    public function __call($name, $arguments) {    
        // 参数 $name 大小写敏感    
        echo "Calling object method &#39;$name&#39; "    
             . implode(&#39;, &#39;, $arguments). "\n";    
    }    

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

Nowdoc語法

用法和Heredoc類似,但使用單引號。 Heredoc則需要透過使用雙引號來聲明。

Nowdoc中不會做任何變數解析,非常適合傳遞一段PHP程式碼。

// Nowdoc 单引号 PHP 5.3之后支持    $name = &#39;MyName&#39;;    
echo <<<&#39;EOT&#39;    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 = &#39;Hello World&#39;;

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

#原本格式為是(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[&#39;param&#39;] ?? 1;

相當於:

$param = isset($_GET[&#39;param&#39;]) ? $_GET[&#39;param&#39;] : 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

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

#

太空船操作符用於比較兩個表達式。當   a#大 ##於

###############小################### #####於#####################################  ######

以上是整合PHP5.X到PHP7.1.x的特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除