首頁 > 軟體

PHP 5.3 新特性詳解

2020-06-16 18:05:02

1 PHP 5.3中的新特性

1.1 支援名稱空間 (Namespace)

毫無疑問,名稱空間是PHP5.3所帶來的最重要的新特性。

在PHP5.3中,則只需要指定不同的名稱空間即可,名稱空間的分隔符為反斜桿。

//select.php
<?php   
    namespace ZendDbTable;   
    class Select {

    }
?> 

這樣即使其它名稱空間下存在名為Select的類,程式在呼叫時也不會產生衝突。程式碼的可讀性也有所增加。
呼叫方法:

//call.php
<?php   
    //namespace ZendDb;   
    include('select.php');   
    $s = new ZendDbTableSelect();   
    $s->test();
?>

1.2. 支援延遲靜態系結(Late Static Binding)

在PHP5中,我們可以在類中通過self關鍵字或者__CLASS__來判斷或呼叫當前類。但有一個問題,如果我們是在子類中呼叫,得到的結果將是父類別。因為在繼承父類別的時候,靜態成員就已經被繫結了。 例如:

<?php   
class A {   
    public static function who() {   
        echo __CLASS__;   
    }   
    public static function test() {   
        self::who();   
    }   
}   
class B extends A {   
    public static function who() {   
        echo __CLASS__;   
    }   
}   
B::test();

//以上程式碼輸出的結果是: A ; 這和我們的預期不同,我們原來想得到子類的相應結果。

PHP 5.3.0中增加了一個static關鍵字來參照當前類,即實現了延遲靜態系結:

<?php   
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

1.3 支援goto語句

多數計算機程式設計語言中都支援無條件轉向語句goto,當程式執行到goto語句時,即轉向由goto語句中的標號指出的程式位置繼續執行。儘管 goto語句有可能會導致程式流程不清晰,可讀性減弱,但在某些情況下具有其獨特的方便之處,例如中斷深度巢狀的迴圈和 if 語句。

<?php 
 
    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'; 

1.4 支援閉包、Lambda/Anonymous函數

閉包(Closure)函數和Lambda函數的概念來自於函數程式設計領域。例如JavaScript 是支援閉包和 lambda 函數的最常見語言之一。 在PHP中,我們也可以通過create_function()在程式碼執行時建立函數。但有一個問題:建立的函數僅在執行時才被編譯,而不與其它程式碼同時被編譯成執行碼,因此我們無法使用類似APC這樣的執行碼快取來提高程式碼執行效率。在PHP5.3中,我們可以使用Lambda/匿名函數來定義一些臨時使用(即用即棄型)的函數,以作為array_map()/array_walk()等函數的回撥函數。

<?php   
    echo preg_replace_callback('~-([a-z])~', function ($match) {   
        return strtoupper($match[1]);   
    }, 'hello-world');   
    // 輸出 helloWorld 
 
    $greet = function($name)   
    {   
        printf("Hello %srn", $name);   
    };   
    $greet('World');   
    $greet('PHP');
 
    //...在某個類中   
    $callback = function ($quantity, $product) use ($tax, &$total) {   
      $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));   
      $total += ($pricePerItem * $quantity) * ($tax + 1.0);   
    };   
    array_walk($products, $callback); 

1.5 新增兩個魔術方法__callStatic()和__invoke()

PHP中原本有一個魔術方法__call(),當程式碼呼叫物件的某個不存在的方法時該魔術方法會被自動呼叫。新增的__callStatic()方法則只用於靜態類方法。當嘗試呼叫類中不存在的靜態方法時,__callStatic()魔術方法將被自動呼叫。 

<?php   
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()方法將被自動呼叫。

<?php   
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 

1.6 新增Nowdoc語法

用法和Heredoc類似,但使用單引號。Heredoc則需要通過使用雙引號來宣告。 Nowdoc中不會做任何變數解析,非常適合於傳遞一段PHP程式碼。

<?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來初始化靜態變數、類成員和類常數。

<?php   
// 靜態變數   
function foo()   
{   
    static $bar = <<<LABEL   
Nothing in here...   
LABEL;   
}   
// 類成員、常數   
class foo   
{   
    const BAR = <<<FOOBAR   
Constant example   
FOOBAR;   
   
    public $baz = <<<FOOBAR   
Property example   
FOOBAR;   
}

1.7 在類外也可使用const來定義常數

//PHP中定義常數通常是用這種方式 
define("CONSTANT", "Hello world."); 
 
//並且新增了一種常數定義方式 
const CONSTANT = 'Hello World';

1.8 三元運算子增加了一個快捷書寫方式

原本格式為是(expr1) ? (expr2) : (expr3) ; 如果expr1結果為True,則返回expr2的結果。
PHP5.3新增一種書寫方式,可以省略中間部分,書寫為expr1 ?: expr3 ; 如果expr1結果為True,則返回expr1的結果 

//原格式 
$expr=$expr1?$expr1:$expr2 
//新格式 
$expr=$expr1?:$expr2

1.9 HTTP狀態碼在200-399範圍內均被認為存取成功

1.10支援動態呼叫靜態方法

class Test{   
    public static function testgo()   
    {   
        echo "gogo!";   
    }   
}   
$class = 'Test';   
$action = 'testgo';   
$class::$action();  //輸出 "gogo!" 

2 PHP5.3中其它值得注意的改變

1.1 修復了大量bug
1.2 PHP效能提高
1.3 php.ini中可使用變數
1.4 mysqlnd進入核心擴充套件 理論上說該擴充套件存取mysql速度會較之前的MySQL 和 MySQLi 擴充套件快(參見http://dev.mysql.com/downloads/connector/php-mysqlnd/
1.5 ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等擴充套件預設隨PHP系結發布。其中Phar可用於打包PHP程式,類似於Java中的jar機制。

1.6 ereg 正規表示式函數 不再預設可用,請使用速度更快的PCRE 正規表示式函數

3 棄用功能

PHP 5.3.0 新增了兩個錯誤等級: E_DEPRECATED 和 E_USER_DEPRECATED. 錯誤等級 E_DEPRECATED 被用來說明一個函數或者功能已經被棄用. E_USER_DEPRECATED 等級目的在於表明使用者程式碼中的棄用功能, 類似於 E_USER_ERROR 和 E_USER_WARNING 等級.

下面是被棄用的 INI 指令列表. 使用下面任何指令都將導致 E_DEPRECATED 錯誤.
define_syslog_variables
register_globals
register_long_arrays
safe_mode
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase
棄用 INI 檔案中以 '#' 開頭的註釋.

棄用函數:
call_user_method() (使用 call_user_func() 替代)
call_user_method_array() (使用 call_user_func_array() 替代)
define_syslog_variables()
dl()
ereg() (使用 preg_match() 替代)
ereg_replace() (使用 preg_replace() 替代)
eregi() (使用 preg_match() 配合 'i' 修正符替代)
eregi_replace() (使用 preg_replace() 配合 'i' 修正符替代)
set_magic_quotes_runtime() 以及它的別名函數 magic_quotes_runtime()
session_register() (使用 $_SESSION 超全部變數替代)
session_unregister() (使用 $_SESSION 超全部變數替代)
session_is_registered() (使用 $_SESSION 超全部變數替代)
set_socket_blocking() (使用 stream_set_blocking() 替代)
split() (使用 preg_split() 替代)
spliti() (使用 preg_split() 配合 'i' 修正符替代)
sql_regcase()
mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)
mysql_escape_string() (使用 mysql_real_escape_string() 替代)
廢棄以字串傳遞區域設定名稱. 使用 LC_* 系列常數替代.
mktime() 的 is_dst 引數. 使用新的時區處理常式替代.
棄用的功能:
棄用通過參照分配 new 的返回值.
呼叫時傳遞參照被棄用.

 

CentOS 6.3 安裝LNMP (PHP 5.4,MyySQL5.6) http://www.linuxidc.com/Linux/2013-04/82069.htm

在部署LNMP的時候遇到Nginx啟動失敗的2個問題 http://www.linuxidc.com/Linux/2013-03/81120.htm

Ubuntu安裝Nginx php5-fpm MySQL(LNMP環境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

《細說PHP》高清掃描PDF+光碟原始碼+全套教學視訊 http://www.linuxidc.com/Linux/2014-03/97536.htm

CentOS 6中設定PHP的LNMP的開發環境  http://www.linuxidc.com/Linux/2013-12/93869.htm


IT145.com E-mail:sddin#qq.com