偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

PHP 5.3新版特性淺析

開發(fā) 后端
php5.3是php5的一個(gè)里程碑,加入了大量新特性。本文介紹了php5.3的一些新功能的優(yōu)點(diǎn)和問題,其中舉例說明了如延遲靜態(tài)綁定,日期函數(shù),匿名函數(shù)和閉包等新增功能的語法和使用

從php4到php5,從個(gè)人框架到開源框架的發(fā)展,見證著php從山寨走上正規(guī)大軍的發(fā)展。php6還在醞釀中,相信php5會(huì)作為php6小試牛刀的場(chǎng)地。php5.3是php5的一個(gè)里程碑,加入了大量新特性。

我個(gè)人總感覺php功能是越來越多了,但是php的語法卻越來越丑陋了,有時(shí)加入了新功能,而新功能帶來了問題,為了修復(fù)問題,又要加入新的語法來修復(fù),郁悶。估計(jì)php用語法修復(fù)問題是為了更好的解析。

一、mysql驅(qū)動(dòng)mysqlnd

一直以來,php都是通過mysql客戶端連接mysql,而現(xiàn)在mysql官方已經(jīng)推出php版的mysql客戶端,而這個(gè)mysqlnd有效降低內(nèi)存的使用以及提高性能。具體可以看:

http://dev.mysql.com/downloads/connector/php-mysqlnd/

http://forge.mysql.com/wiki/PHP_MYSQLND

從圖中可以看出,使用mysqlnd少了從mysql驅(qū)動(dòng)中復(fù)制數(shù)據(jù)到php擴(kuò)展這一步。mysqlnd使用copy-on-write,也就是寫時(shí)復(fù)制,讀引用。

mysqlnd已經(jīng)內(nèi)置在php5.3的源碼中,編譯的時(shí)候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安裝mysqlnd驅(qū)動(dòng)。

mysqlnd的優(yōu)點(diǎn)

編譯php更方便了,不需要libmysql,已經(jīng)內(nèi)置在源碼中

  1. 編譯php更方便了,不需要libmysql,已經(jīng)內(nèi)置在源碼中
  2. 使用php許可,避免版權(quán)問題
  3. 使用php的內(nèi)存管理,支持php內(nèi)存限制(memory_limit)
  4. 所有數(shù)據(jù)在內(nèi)存只有一份,之前的libmysql有兩份,參考上圖
  5. 提供性能統(tǒng)計(jì)功能,幫助分析瓶頸
  6. mysqli支持長連接(persistent connections)
  7. 性能絕對(duì)比libmysql要快
  8. 在驅(qū)動(dòng)層增加緩存機(jī)制

看了這么多特點(diǎn),有點(diǎn)矛盾,作為數(shù)據(jù)庫抽象層的PDO能把不同后端的特點(diǎn)發(fā)揮出來嗎?如果使用mysql作為數(shù)據(jù)庫的話mysqli是不是更好的選擇?我總覺得mysqli只是個(gè)過度產(chǎn)品,PDO才是未來的。

二、性能提高

  1. md5()大概提高了10%-15%的性能
  2. Better stack implementation in the engine,沒明白
  3. 常量保存在ROM里(Constants moved to read-only memory),這里沒明白意思
  4. 改進(jìn)異常處理,操作碼(opcode)更簡潔
  5. 解決了include(require)_once重復(fù)打開的問題,之前once我都是用靜態(tài)變量實(shí)現(xiàn)的,終于解決這個(gè)問題了
  6. 用gcc4編譯的二進(jìn)制文件將更小
  7. 整體性能提高了5%-15%

很多人覺得web的瓶頸在db,所以app應(yīng)用的性能毫不在乎,我認(rèn)為主要是因?yàn)閍pp擴(kuò)展比db擴(kuò)展要容易得多,所以才會(huì)產(chǎn)生db瓶頸,但這并不意味著可以不顧慮app的性能,畢竟最終還是要在app里解決各種問題的,作為一名程序員編寫高質(zhì)量的代碼是最基本的要求。程序的內(nèi)存使用量少點(diǎn)和執(zhí)行速度快點(diǎn),在高并發(fā)下是有很效果的,有些時(shí)候你改動(dòng)下實(shí)現(xiàn)方法,能提高幾十倍也很正常,當(dāng)然如果付出要很多收獲很少的時(shí)候就不要太執(zhí)著了,我覺得一定要有編寫高質(zhì)量代碼的意識(shí)。

三、?:操作符

其實(shí)就是js里的||,返回的結(jié)果不是邏輯類型,而是返回本來變量的值,例如 false ?: 123返回123,而不是true。語法就是有點(diǎn)怪怪! #p#

四、名字空間(namespace)

這是個(gè)很好的功能,沒加入之前都是用前綴來解決命名污染的,方法有點(diǎn)山寨,呵呵。

五、延遲靜態(tài)綁定(Late Static Binding)

我估計(jì)php的靜態(tài)是在預(yù)編譯時(shí)就固定好的,所以在繼承的時(shí)候,父類里的self指的是父類,而不是子類。而php5.3加入了新的語法static,可以在運(yùn)行時(shí)候捕捉當(dāng)前類。

比較典型的例子就是單件模式了:

class ParentClass {    
static private $_instance;

private function __construct() {

}

static public function getInstance() {
if (!isset(self::$_instance)) {
self::$_instance = new self();
}

return self::$_instance;
}
}

如果繼承這個(gè)父類,那子類的單件必須再重寫覆蓋父類的getInstance。5.3支持用static來延遲綁定,但是很遺憾,即使有static關(guān)鍵字卻不能使用new static來實(shí)例化,不過有變通的方法

class ParentClass {    
static private $_instance;

private function __construct() {

}

static public function getInstance() {
if (!isset(self::$_instance)) {
$class = static::getClass();// 使用static延遲綁定
self::$_instance = new $class();
}

return self::$_instance;
}

static public function getClass() {
return __CLASS__;
}
}


這個(gè)新特性當(dāng)前可能會(huì)有問題存在,暫時(shí)不建議使用。

六、新的魔法函數(shù)__callStatic

其實(shí)就是__call的靜態(tài)版,調(diào)用的靜態(tài)方法不存在會(huì)調(diào)用這個(gè)魔法函數(shù),但是低效

七、通過變量調(diào)用靜態(tài)(Variable Static Calls)

以前可以通過變量調(diào)用對(duì)象的方法,例如$instance->$method();,而靜態(tài)方法不支持,5.3后就支持了可以通過$someClass::$method()調(diào)用了,但是低效。

八、日期函數(shù)date_create_from_format

把字符串轉(zhuǎn)換成時(shí)間戳,如果使用strtotime的話,日期格式是php解析的,而5.3的date_create_from_format可以設(shè)置字符串的日期格式,

$date = strtotime("08-01-07 00:00:00");//php 認(rèn)為格式 是年-月-日   
var_dump(date("Y-m-d", $date)); // string(10) "2008-01-07"
$date = date_create_from_format("m-d-y", "08-01-07");//告訴php格式是 月-日-年
var_dump($date->format('Y-m-d')); // string(10) "2007-08-01"


九、匿名函數(shù)(Lambda functions)和閉包(closures)

js有個(gè)很爽的地方就是支持函數(shù)式編程,php很不爽的地方就是函數(shù)太過正規(guī)了,不過5.3后php更自由了。

定義匿名函數(shù)的語法

$lambda = function () { echo "Hello World!\n"; };

function replace_spaces ($text) {   
$replacement = function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
};
return preg_replace_callback ('/( +) /', $replacement, $text);
}


function replace_spaces ($text) {   
return preg_replace_callback ('/( +) /',
function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
}, $text);
}


產(chǎn)生閉包的語法

function (normal parameters) use ($var1, $var2, &$refvar) {} 

引入了use語法,并且支持引用變量

十、新魔法常量__DIR__

以前只有__FILE__,為了得到當(dāng)前文件所在的路徑,都是用dirname(__FILE__)來得到的,現(xiàn)在可以用__DIR__代替了

十一、NOWDOC

php定義字符串有一種格式叫定界符.

$foo = <<
  this is $fubar 
ONE;

這種方式稱為HEREDOC,php會(huì)解析里面的變量,而有時(shí)候我們不需要解析變量,5.3加入了NOWDOC,其實(shí)就是定界符的單引號(hào)版

$bar = <<<'TWO' this is $fubar TWO;

這樣,php只把它當(dāng)作字符串,變量不會(huì)解析

十二、GC

因?yàn)閜hp本身工作機(jī)制的原因,所以php的GC機(jī)制只要高效就夠了,允許少量內(nèi)存泄漏,畢竟程序執(zhí)行完畢就會(huì)釋放所有申請(qǐng)的內(nèi)存,根本不會(huì)有內(nèi)存泄漏的問題,但這只是對(duì)于短暫運(yùn)行的程序而言,如果用php編寫持久執(zhí)行就要考慮內(nèi)存泄漏問題了。
php的GC機(jī)制采用引用計(jì)數(shù)機(jī)制,引用計(jì)數(shù)是很簡單高效的GC機(jī)制,不過缺點(diǎn)也很明顯,不能完全回收所有已無效的變量,例如變量相互引用了,就無法回收了,5.3里加入的GC函數(shù),其實(shí)就是起到增強(qiáng)GC機(jī)制的作用。

gc_enable(); // 激活GC,增強(qiáng)GC機(jī)制,回收循環(huán)引用的無效變量 
var_dump(gc_collect_cycles()); // 強(qiáng)制回收已無效的變量
gc_disable(); // 禁用GC

【編輯推薦】

  1. PHP5中的異常處理詳解
  2. PHP 5中新增加日期(date)函數(shù)的常量簡介
  3. 簡評(píng)用PHP開發(fā)大型系統(tǒng)的缺點(diǎn)
責(zé)任編輯:yangsai 來源: JaveEye
相關(guān)推薦

2009-10-26 09:41:26

PHP5.3閉包特性

2009-05-13 14:15:09

PHP 5.3閉包匿名函數(shù)

2009-07-24 17:30:37

Javascript閉

2013-11-26 10:00:09

VMware Hori虛擬化Wmware

2013-11-26 10:00:30

VMware Hori

2009-11-23 14:17:50

PHP 5.3閉包語法

2014-12-23 14:36:32

PHP

2009-09-18 15:53:37

C# 3.0新語言特性

2009-07-09 18:36:50

MyEclipse 6

2022-02-10 09:37:14

@layerCSSChrome

2009-09-18 09:59:39

C# CLR

2023-11-15 20:51:18

TypeScript前端

2009-12-29 13:43:21

Ubuntu 9.10

2010-11-03 10:31:51

PHP魔術(shù)方法

2010-12-10 13:57:45

PHP Extensi

2009-12-11 10:59:48

PHP函數(shù)extrac

2009-01-16 14:08:42

PHP開發(fā)Web應(yīng)用執(zhí)行效率

2011-04-11 09:11:42

GNOME 3

2009-05-26 09:28:22

C# 4.0dynamic動(dòng)態(tài)類型

2009-07-09 10:28:19

線程池JDK5
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)