第1次親密接觸PHP5(1)_PHP教程

來源:互聯網
上載者:User
文章來源: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;
}

function display() {
print($this->x);
}

function __destruct() {
print("bye bye");
}
}

$o1 = new foo(4);
$o1->display();
?>

運行完你將看到輸出了"bye bye",這是因為類在終止的時候調用了__destruct()解構函式~~

對象的引用

正如你所知道的一樣,在PHP4中,對一個函數或方法傳遞一個變數時,實際上是傳遞了一個copy,除非你用了傳址符&來聲明
你在做一個變數的引用。在PHP5中,對象總是以引用的方式被指定:
例2:對象的引用

class foo {
var $x;

function setX($x) {
$this->x = $x;
}

function getX() {
return $this->x;
}
}

$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;

public function public_foo() {
print("I'm public");
}

protected function protected_foo() {
$this->private_foo(); //Ok because we are in the same class we can call private methods
print("I'm protected");
}

private function private_foo() {
$this->x = 3;
print("I'm private");
}
}

class foo2 extends foo {
public function display() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // Invalid! the function is private in the base class
}
}

$x = new foo();
$x->public_foo();
//$x->protected_foo(); //Invalid cannot call protected methods outside the class and derived classes
//$x->private_foo(); //Invalid private methods can 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 {
function doprint();
}

class foo implements displayable,printable {
function display() {
// code
}

function doprint() {
// code
}
}
?>

這對代碼的閱讀性和理解性是非常有協助的:讀到該類時,你就知道foo包含了介面displayable和printable,而且一定有print()(二泉 註:應該是doprint())方法和display()方法。不必知道它們內部是如何?就可輕鬆操作它們只要你看到foo的聲明。

虛擬類

虛擬類是一種不能被執行個體化的類,它可以像超類一樣,可以定義方法和變數。
在虛擬類中還可以定義虛擬方法,而且在該方法也不能在該類是被實現,但必須在其子類中被實現

Example 6: 虛擬類

abstract class foo {
protected $x;

abstract function display();

function setX($x) {
$this->x = $x;
}
}


class foo2 extends foo {
function display() {
// Code
}
}
?>


__call()方法

在PHP5時,如果你定義了 __call()方法,當你試圖訪問類中一個不存在的變數或方法時,__call()就會被自動調用:
Example 7: __call


class foo {

function __call($name,$arguments) {
print("Did you call me? I'm $name!");
}
}

$x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>


這個特殊的方法被習慣用來實現"方法重載",因為你依靠一個私人參數來實現並檢查這個參數:
Exampe 8: __call 實現方法重載

class Magic {

function __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
}

private function foo_for_int($x) {
print("oh an int!");
}

private function foo_for_string($x) {
print("oh a string!");
}
}

$x = new Magic();
$x->foo(3);
$x->foo("3");
?>


__set()方法 和 __get()方法

當訪問或設定一個未定義的變數時,這兩個方法將被調用:

Example 9: __set and __get

class foo {

function __set($name,$val) {
print("Hello, you tried to put $val in $name");
}

function __get($name) {
print("Hey you asked for $name");
}
}

$x = new foo();
$x->bar = 3;
print($x->winky_winky);
?>

http://www.bkjia.com/PHPjc/314174.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/314174.htmlTechArticle文章來源:PHPBuilder.com 原作者:Luis Argerich 翻譯:erquan erquan註:本人現還未來得及體驗PHP5,只是翻譯一篇老外的文章。 以下均由erquan翻譯...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.