本文目錄:
PHP5.2 之前:autoload, PDO 和 MySQLi, 類型約束
PHP5.2:JSON 支持
PHP5.3:棄用一些功能、匿名函數,新增魔術方法,命名空間,後期靜態綁定,Heredoc 和 Nowdoc, const, 三元運算符,Phar
PHP5.4:Short Open Tag, 數組簡寫形式,trait, 內置 Web 服務器,細節修改,移除safemode
PHP5.5:yield, list() 用於 foreach, 細節修改
PHP5.6: 常量加強,可變函數參數,命名空間加強php
1. PHP5.2之前。web
#__autoload function __autoload($classname) { require_once("{$classname}.php") }
但該函數已經不被建議使用,緣由是一個項目中僅能有一個這樣的 __autoload() 函數,由於 PHP 不容許函數重名。取而代之:json
spl_autoload_register(function($classname) { require_once("{$classname}.php") });
約束類型:segmentfault
// 限制第一個參數爲 MyClass, 第二個參數爲可執行類型,第三個參數爲數組 function MyFunction(MyClass $a, callable $b, array $c) { // ... }
2. PHP5.2數組
json_encode和json_decode服務器
3. PHP5.3函數
棄用的功能:post
register_globals (將post,get自動轉化成變量)ui
if(isAuth()) $authorized = true; if($authorized) include("page.php");
若是訪問 /auth.php?authorized=1 來定義該變量值,繞過身份驗證。spa
Magic Quotes(自動轉義用戶輸入)
Safe Mode
新增的功能:
匿名函數
function aa($func){ echo $func(); } aa(function(){ return 'AA'; }); $a = function(){ return 123; }; //這個分號必須有,要不報錯 echo $a();
魔術方法:新增__invoke(), __callStatic()魔術方法
命名空間:
<?php // 命名空間的分隔符是反斜槓,該聲明語句必須在文件第一行。 // 命名空間中能夠包含任意代碼,但只有 **類, 函數, 常量** 受命名空間影響。 namespace XXOO\Test; // 該類的完整限定名是 \XXOO\Test\A , 其中第一個反斜槓表示全局命名空間。 class A{} // 你還能夠在已經文件中定義第二個命名空間,接下來的代碼將都位於 \Other\Test2 . namespace Other\Test2; // 實例化來自其餘命名空間的對象: $a = new \XXOO\Test\A; class B{} // 你還能夠用花括號定義第三個命名空間 namespace Other { // 實例化來自子命名空間的對象: $b = new Test2\B; // 導入來自其餘命名空間的名稱,並重命名, // 注意只能導入類,不能用於函數和常量。 use \XXOO\Test\A as ClassA }
Heredoc 和 Nowdoc
$name = "MyName"; echo <<< TEXT My name is "{$name}". TEXT; #result: My name is "MyName".
Nowdoc
$name = "MyName"; echo <<< 'TEXT' My name is "{$name}". TEXT; #result: My name is "{$name}"
Nowdoc 的行爲像一個單引號字符串,不能在其中嵌入變量,和 Heredoc 惟一的區別就是,三個左尖括號後的標識符要以單引號括起來。
const 能夠用在class外部,像define,但不能進行運算
<?php const E = 123; class A{ const A = 123; } #錯誤的寫法 const E = 123 * 123;
三元運算符簡寫
#舊的 echo $a ? $a : "No Value"; #新的 echo $a ?: "No Value"; //三元運算符的簡寫,其中 true的那個位置是給的 問號 前面的值 $a = 'aa'; echo isset($a) ?: 'bbb'; 返回 1
後期靜態綁定:
class ATest { public function say() { echo 'Segmentfault'; } public function callSelf() { self::say(); } public function callStatic() { static::say(); } } class BTest extends ATest { public function say() { echo 'PHP'; } } $b = new BTest(); $b->say(); // output: php $b->callSelf(); // output: segmentfault $b->callStatic(); // output: php
4. PHP5.4
Short Open Tag 自 PHP5.4 起老是可用
數組的簡寫
$arr = array(1, 2, 3); $arr = [1, 2, 3]
trait 是爲相似 PHP 的單繼承語言而準備的一種代碼複用機制。Trait 爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用 method
#trait 實現多繼承 // trait不能被單獨實例化,只能被類所包含 trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld { // 將SayWorld中的成員包含進來 use SayWorld; } $xxoo = new MyHelloWorld(); // sayHello() 函數是來自 SayWorld 構件的 $xxoo->sayHello();
內置web服務器
5. PHP5.5
yield關鍵字用於當函數須要返回一個迭代器的時候, 逐個返回值。
function number10() { for($i = 1; $i <= 10; $i += 1) yield $i; } #結果 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list() 用於 foreach
能夠用 list() 在 foreach 中解析嵌套的數組:
$array = [ [1, 2, 3], [4, 5, 6], ]; foreach ($array as list($a, $b, $c)) echo "{$a} {$b} {$c}\n"; #result: 1 2 3 4 5 6
6. PHP5.6
const支持計算
更好的可變函數參數用於代替 func_get_args()
function add(...$args) { $result = 0; foreach($args as $arg) $result += $arg; return $result; } $arr = [2, 3]; add(1, ...$arr); #result: 6
命名空間加強。能夠在裏面定義常量和方法
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(); }