php5各個版本的區別

本文目錄:
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();
}
相關文章
相關標籤/搜索