毫無疑問,命名空間是PHP5.3所帶來的最重要的新特性。
在PHP5.3中,則只需要指定不同的命名空間即可,命名空間的分隔符為反斜桿。
//select.php<?php namespace ZendDbTable; html' target='_blank'>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(); //以上代碼輸出的結果是: B1.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 %s', $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). ''; } /** PHP 5.3.0 以上版本中本類方法有效 */ public static function __callStatic($name, $arguments) { // 參數 $name 大小寫敏感 echo '調用靜態方法 '$name' ' . implode(' -- ', $arguments). ''; } } $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). ''; } /** PHP 5.3.0 以上版本中本類方法有效 */ public static function __callStatic($name, $arguments) { // 參數 $name 大小寫敏感 echo 'Calling static method '$name' ' . implode(', ', $arguments). ''; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); // As of PHP 5.3.01.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?:$expr21.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 的返回值.
調用時傳遞引用被棄用.
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答