推薦(免費):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 '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 *
2 == 512 a == 8
# 太空船操作符用於比較兩個表達式。當
a#大 ##於、等於或
以上是整合PHP5.X到PHP7.1.x的特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!