Namespaces
php 5.3最大的改動,毫無疑問就是Namespaces(此前有一篇相關的PHP Namespaces FAQ)。這給php開發人員帶來的好處很多,廣爲人們所詬病的函數命名問題也獲得瞭解決。php
代碼更清晰
5.3以前常見的代碼,須要自定義前綴區分函數和類名html
PLAIN TEXTmysql
CODE:sql
function MY_wrapper() {}
class MY_DB { }
define('MY_CONN_STR', '');
MY_wrapper();
new MY_DB();
MY_CONN_STR;
緩存
使用名稱空間以後,代碼看上去更加clean。app
PLAIN TEXTless
CODE:dom
namespace MY;
function wrapper() {}
class DB { }
const CONN_STR = '';
use MY AS MY;
wrapper();
new DB();
CONN_STR;
一個文件中定義了多個namespace
若是一個文件中定義了多個namespace,應該怎樣處理?ide
PLAIN TEXT函數
CODE:
namespace LIB;
class MySQL {}
class SQLite {}
$b = new SQLite();
namespace LIB_EXTRA;
class MScrypt {}
$a = new MScrypt();
var_dump(
get_class($a),
get_class($b)
);
以上代碼輸出爲:
PLAIN TEXT
CODE:
string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
php是解釋執行的語言,以上結果合情合理。
namespace的優先級
namespace中定義的函數,類和常量優先,其次纔是全局的。
PLAIN TEXT
CODE:
namespace foo;
function strlen($foo) { return htmlentities($foo); }
echo strlen("test"); // test
echo ::strlen("test"); // 4
echo namespace::strlen("test"); // test
namespace和autoload的友情
autoload會根據namespace名稱以及class名稱來解析類文件位置
僅當namespace和全局範圍都沒找到class定義的狀況下,autoload纔會被觸發
在namespace中定義的__autoload不會被自動調用
PLAIN TEXT
CODE:
function __autoload($var) { var_dump($var); } // LIB::foo
require "./ns.php"; /*
<?php
namespace LIB;
new foo();
*/
namespace一些輔料
PLAIN TEXT
CODE:
namespace really::long::pointlessly::verbose::ns;
__NAMESPACE__; // 新增的魔法常量,表示當前namespace名稱
class a{}
get_class(new a()); // really::long::pointlessly::verbose::ns::a
use really::long::pointlessly::verbose::ns::a AS b;// 從名稱空間中引用一個類
注:這裏的內容節選自pdfIntroduction to PHP 5.3 Slides,後文再也不復述。
性能提高
php 5.3的整體性能提高了5 - 15%
md5()快了10-15%
Better stack implementation in the engine
Constants移到read-only內存裏
exception處理過程改進(簡化,opcodes更少)
(require/include)_once改進,去掉重複open
Smaller binary size & startup size with gcc4
新語言特性__DIR__
在5.3之前,爲了得到當前腳本的目錄,須要一次函數調用
PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
在5.3,只須要一個魔術常量__DIR__就解決了。
PLAIN TEXT
CODE:
echo __DIR__; // >= PHP 5.3
?:操做符
便捷的?:操做符,能夠從兩個值/表達式中快速取得非空值。
PLAIN TEXT
CODE:
$a = true ?: false; // true
$a = false ?: true; // true
$a = "" ?: 1; // 1
$a = 0 ?: 2; // 2
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a"); // 1
__callStatic()
新增了魔術方法__callStatic,功能和__call相似,可是僅對static方法有效。
PLAIN TEXT
CODE:
class helper {
static function __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
helper::test("foo","bar"); // test(foo,bar)
動態調用static方法
動態的調用靜態方法?動靜結合。
PLAIN TEXT
CODE:
class helper {
static function foo() { echo __METHOD__; }
}
$a = "helper";
$b = "foo";
$a::$b(); // helper::foo
Late Static Binding
不知道怎麼譯,可能留個原文更容易理解。靜態方法的事件處理時機有變化,之前是在編譯期處理,如今是執行期間處理。
在php 5.3以前,下面的代碼會輸出一個A,可是這不是我們要的,whoami方法已經在class B中從新定義,它本該輸出B才符合我們想固然的思惟。
PLAIN TEXT
CODE:
class A {
public static function whoami() {
echo __CLASS__;
}
public static function identity() {
self::whoami();
}
}
class B extends A {
public static function whoami() {
echo __CLASS__;
}
}
B::identity(); // A <-- PHP <5.3
下面代碼中使用了static::whoami()來調用靜態方法。php 5.3以後,因爲__CLASS__是在執行期被處理,那麼這個例子中能順利抓到class B。
PLAIN TEXT
CODE:
class A {
public static function whoami() {
echo __CLASS__;
}
public static function identity() {
static::whoami();
}
}
class B extends A {
public static function whoami() {
echo __CLASS__;
}
}
B::identity(); // B <-->= PHP 5.3
mysqlnd
見mysqlnd成爲php 5.3中的默認mysql驅動
可是PDO_MySQL暫時還不支持mysqlnd,目前只有mysql(i)擴展能夠用到
以前介紹的php 5.3的新特性,都是方便開發人員的東東。下面介紹個很討虛擬主機提供商喜歡的特性。
加強的ini文件支持
CGI/ FastCGI支持相似.htaccess的INI配置
每一個目錄下均可以有INI設置,ini的文件名取決於php.ini的配置,可是[PATH=/var/www/domain.com], [HOST=www.domain.com]段落的設置用戶不能修改。
加強的error handling
容許在ini文件中定義變量和常量,能夠在程序中直接調用。
附上一段ini文件的例子
PLAIN TEXT
CODE:
#用戶自定義的php.ini文件名(.htaccess). 默認是".user.ini"user_ini.filename=".user.ini" #若是要禁用這個特性,設置爲空值便可user_ini.filename= #用戶自定義的php.ini文件TTL時長(time-to-live),單位爲秒,我理解爲緩存過時時間。默認爲300秒user_ini.cache_ttl=300 [PATH=/var/www/domain.com]variables_order = GPCsafe_mode =1 [my variables]somevar = 「1234」anothervar = ${somevar}; anothervar == somevar [ini arrays]foo[bar]=1foo[123]=2foo[]=3