文章來源:PHPBuilder.com
原作者:Luis Argerich
翻譯:erquan
erquan附註:本人現還未來得及體驗PHP5,只是翻譯一篇老外的文章。
以下皆由erquan翻譯,第1次作這些的事情希望沒有誤導大家。有些不准的地方請諒解。
大家看這樣的行不行,如果行的話,偶就翻譯完,不行就翻譯了,免得誤導了大家,也累哦。 。 。 。 :)
轉貼時請註明文章來源,謝謝:)
PHP5的正式版還沒發布,但我們可以學習、體驗下開發版帶給我們的PHP新特性。
本文將集中介紹以下3大PHP5新功能:
* 新物件模式
* 結構化異常處理
* 名稱空間
在正式開始之前,請注意:
*文章中的部分例子用PHP4的方法實現,只是為了增強文章的可讀性
*本文所描述的新特性可能會與正式版特性有出入,請以正式版本為準。
* 新物件模式
PHP5新的物件模式在PHP4的基礎上做了很大的"升級",你看起來會很像JAVA:(。
下面的一些文字將對它做一些簡單介紹,並且附有小例子讓您開始體驗PHP5的新特性
come on~~:)
* 構造函數和析構函數
* 物件的引用
*複製物件
* 物件的3種模式:私有、公有和受保護
* 介面
* 虛擬類別
* __call()
* __set()和__get()
* 靜態成員
建構子 和 析構函式
在PHP4中,和類別名稱一樣的函式被預設為該類別的建構器,在PHP4沒有析構函式的概念。 (二泉注:這點和JAVA一樣)
但從PHP5開始,構造函數被統一命名為__construct,而且有了析構函數:__destruct(二泉注:這點卻和Delphi一樣,可見PHP5吸收了眾多的成熟的OO思想,可C可賀~~):
例1:構造函數和析構函數
class foo {
var $x ;
function __construct($x) {
$this->x = $x;
}
hfunction display(this x);
}
function __destruct() {
print("bye bye");
}
}
}
);
$o1->display();
?>
運行完你將看到輸出了"bye bye",這是因為類別在終止的時候調用了__destruct( )析構函數~~
物件的引用
正如你所知道的一樣,在PHP4中,對一個函數或方法傳遞一個變數時,實際上是傳遞了一個copy,除非你用了傳址符&來聲明
你在做一個變數的引用。在PHP5中,物件總是以引用的方式被指定:
例2:物件的引用
class foo {
var $x;
function setX($x) {
$this->x = $x;
}
function getX() {
🎜>}
$o1 = new foo;
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("Oh my god!");
?>
(二泉註:你將會看到"Oh my god!"的輸出)
複製物件
如上,如果有時不想得到物件的引用而想用copy時,怎麼辦?在PHP5提供的__clone 方法中實作:
例3:複製物件
class foo {
var $x;
function setX($ x) {
$this->x = $x;
}
function getX() {
return $this->x;
$o1 = new foo;
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5);
if($o1->getX() != $o2->getX()) print("Copies are independant");
?>
克隆物件的方法已被應用到很多語言中,所以你不必擔心它的性能:)。
Private, Public 和 Protected
在PHP4中,你可以在物件的外部操作它任意的方法和變數--因為方法和變數是公用的。在PHP5引用了3種模式來控制
對變數、方法的控制權限:Public(公用的)、Protected(受保護)和Private(私有)
Public:方法和變數可以在任意的時候被訪問到
Private:只能在類別的內部被訪問,子類別也不能訪問
Protected:只能在類別的內部、子類別中被存取
範例4: Public, protected and private
class foo {
private $x;
);
}
protected function protected_foo() {
$this->private_foo(); //Ok because we areare in same class I'm protected");
}
private function private_foo() {
$this->x = 3;
}
}
class foo2 extends foo {
public function display() {
$this->protected_foo();
$this->protected_foo();
$this->d // $this->private_foo(); // Invalid! the function is private in the base class
}
}
$x = new foo();
}
>public_foo();
//$x->protected_foo(); //Invalid cannot call protected methods outside the class and derived classes
//$x->private_foo(); only be used inside the class
$x2 = new foo2();
$x2->display();
?>
提示:變數總是私有形式,直接存取一個私有變數並不是一個好的OOP思想,應該用其他的方法來實現set/get 的功能
介面
就像你知道的一樣,在 PHP4 中實作繼承的語法是"class foo extends parent"。無論在PHP4 或 PHP5 中,都不支援多重繼承即只能從一個類別往下繼承。 PHP5中的"介面"是這樣的一種特殊的類別:它並不具體實現某個方法,只是用來定義方法的名稱和擁有的元素,然後透過關鍵字將它們一起引用並實現具體的動作。
Example 5: 介面
interface displayable {
function display();
}
interface printable();
}
interface printable(face printable) ;
}
class foo implements displayable,printable {
function display() {
// code
print // code
}
}
?>
這對程式碼的閱讀性和理解性是非常有幫助的:讀到該類時,你就知道foo包含了接口displayable和printable,而且一定有print()(二泉注:應該是doprint())方法和display()方法。不必知道它們內部是如何實現就可輕鬆操作它們只要你看到foo的聲明。
虛擬類別
虛擬類別是一種不能被實例化的類,它可以像超類別一樣,可以定義方法和變數。
在虛擬類別中還可以定義虛擬的方法,而且在該方法也不能在該類別是被實現,但必須在其子類別中實現
Example 6: 虛擬類別
abstract class foo {
protected $x;
abstract function display();
this abstract function display();
this abstract function display();
this abstract function display();
this abstract function display();
this abstract function setX($); ->x = $x;
}
}
class foo2 extends foo {
function display() {
🎜> function display() {
> }
?>
__call()方法
在PHP5時,如果你定義了__call()方法,當你試圖存取類別中一個不存在的變數或方法時,__call()就會被自動呼叫:
Example 7: __call
class foo {
function __call($name,$arguments) {
function __call($name,$arguments) {
function __call($name,$arguments) {
I'm $name!");
}
}
$x = new foo();
$x->doStuff();
$x->fancy_stuff ();
?>
這個特殊的方法被習慣用來實現"方法重載",因為你依靠一個私有參數來實現並檢查這個參數:
Exampe 8 : __call 實作方法重載
class Magic {
function __call($name,$arguments) {
function __call($name,$arguments) {
function __call($name,$arguments) {
{
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_forstring($arguments[0]) $guments [0]);
}
}
private function foo_for_int($x) {
private function foo_for_string($x) {
print("oh a string!");
}
}
$x = new Magic();
}
$x = new Magic();
$🎜>
$x = new Magic();
$🎜>
$x = new Magic();
$🎜>
$x = new Magic();
$🎜>
$x = new Magic();
$🎜>
$x = new Magic();$x->foo("3");
?>
__set()方法和__get()方法
當存取或設定一個未定義的變數時,這兩個方法會被呼叫:
Example 9: __set and __get
}}}