您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關PHP5.X到PHP7.1.x的特性有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
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
太空船操作符(組合比較符)
太空船操作符用于比較兩個表達式。當 a大于、等于或小于
感謝各位的閱讀!關于“PHP5.X到PHP7.1.x的特性有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。