這篇文章給大家分享的是有關(guān)PHP5.X到PHP7.1.x的特性有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有衛(wèi)輝免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Buid-in web server內(nèi)置了一個簡單的Web服務(wù)器
把當(dāng)前目錄作為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 操作符開始支持函數(shù)和常量的導(dǎo)入
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 導(dǎo)入的類、函數(shù)和常量現(xiàn)在可以通過單個 use 語句 一次性導(dǎo)入了。
//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};
支持延遲靜態(tài)綁定
static關(guān)鍵字來引用當(dāng)前類,即實現(xiàn)了延遲靜態(tài)綁定
class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 這里實現(xiàn)了延遲的靜態(tài)綁定 } } class B extends A { public static function who() { echo __CLASS__; } } B::test();
輸出結(jié)果:
B
支持goto語句
多數(shù)計算機程序設(shè)計語言中都支持無條件轉(zhuǎn)向語句goto,當(dāng)程序執(zhí)行到goto語句時,即轉(zhuǎn)向由goto語句中的標(biāo)號指出的程序位置繼續(xù)執(zhí)行。盡管goto語句有可能會導(dǎo)致程序流程不清晰,可讀性減弱,但在某些情況下具有其獨特的方便之處,例如中斷深度嵌套的循環(huán)和 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函數(shù)
閉包(Closure)函數(shù)和Lambda函數(shù)的概念來自于函數(shù)編程領(lǐng)域。例如JavaScript 是支持閉包和 lambda 函數(shù)的最常見語言之一。
在PHP中,我們也可以通過create_function()在代碼運行時創(chuàng)建函數(shù)。但有一個問題:創(chuàng)建的函數(shù)僅在運行時才被編譯,而不與其它代碼同時被編譯成執(zhí)行碼,因此我們無法使用類似APC這樣的執(zhí)行碼緩存來提高代碼執(zhí)行效率。
在PHP5.3中,我們可以使用Lambda/匿名函數(shù)來定義一些臨時使用(即用即棄型)的函數(shù),以作為array_map()/array_walk()等函數(shù)的回調(diào)函數(shù)。
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); };
魔術(shù)方法__callStatic()和__invoke()
PHP中原本有一個魔術(shù)方法__call(),當(dāng)代碼調(diào)用對象的某個不存在的方法時該魔術(shù)方法會被自動調(diào)用。新增的__callStatic()方法則只用于靜態(tài)類方法。當(dāng)嘗試調(diào)用類中不存在的靜態(tài)方法時,__callStatic()魔術(shù)方法將被自動調(diào)用。
class MethodTest { public function __call($name, $arguments) { // 參數(shù) $name 大小寫敏感 echo "調(diào)用對象方法 '$name' " . implode(' -- ', $arguments). "\n"; } /** PHP 5.3.0 以上版本中本類方法有效 */ public static function __callStatic($name, $arguments) { // 參數(shù) $name 大小寫敏感 echo "調(diào)用靜態(tài)方法 '$name' " . implode(' -- ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('通過對象調(diào)用'); MethodTest::runTest('靜態(tài)調(diào)用'); // As of PHP 5.3.0
以上代碼執(zhí)行后輸出如下:
調(diào)用對象方法’runTest’ –- 通過對象調(diào)用調(diào)用靜態(tài)方法’runTest’ –- 靜態(tài)調(diào)用
以函數(shù)形式來調(diào)用對象時,__invoke()方法將被自動調(diào)用。
class MethodTest { public function __call($name, $arguments) { // 參數(shù) $name 大小寫敏感 echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } /** PHP 5.3.0 以上版本中本類方法有效 */ public static function __callStatic($name, $arguments) { // 參數(shù) $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 <<支持通過Heredoc來初始化靜態(tài)變量、類成員和類常量。
// 靜態(tài)變量 function foo() { static $bar = <<