<?php // 父類 html' target='_blank'>class Animal { public $name; public $age; // 構(gòu)造函數(shù),使用new操作符生成實(shí)例的時(shí)候自動(dòng)調(diào)用 function __construct($name, $age) { $this->name = $name; $this->age = $age; } public function show() { echo $this->name . ' ' . $this->age . '<br/>' ; } // 析構(gòu)函數(shù),對(duì)象銷毀的時(shí)候自動(dòng)調(diào)用 function __destruct() { echo 'object destroyed' . '<br/>'; } } // 子類 class Dog extends Animal { public $legs; function __construct($name, $age, $legs) { // 調(diào)用父類的方法 parent::__construct($name, $age); $this->legs = $legs; } public function showLegNumber() { echo $this->legs . '<br/>'; } } $myDog = new Dog('candy', 10, 4); $myDog->show(); $myDog->showLegNumber(); $myDog = null; $hisDog = new Dog('sally', 5, 4); $hisDog->show(); ?>
在執(zhí)行對(duì)象方法時(shí),PHP將會(huì)自動(dòng)定義一個(gè)$this的特殊變量(類似js的this),該變量表示對(duì)對(duì)象本身的引用,通過使用$this變量和'->'符號(hào)可以引用對(duì)象本身的所有屬性和方法(類似js的this.)。
析構(gòu)函數(shù)是一個(gè)名為__destruct()的函數(shù),它是在對(duì)象被注銷時(shí)所調(diào)用的。通常PHP會(huì)在所有請(qǐng)求都結(jié)束時(shí)自動(dòng)釋放該對(duì)象所占有的資源,所以析構(gòu)函數(shù)顯的并不是那么重要。但是在某些情況下還是有用處的,如釋放指定的資源或者記錄日志信息。在上例中,就算沒有將$hisDog對(duì)象賦值為null,在腳本執(zhí)行結(jié)束時(shí)也將會(huì)自動(dòng)調(diào)用其析構(gòu)函數(shù)。
類的繼承需使用關(guān)鍵字extends,通常在PHP中使用parent表示父類,常用于訪問父類的方法和屬性;使用self表示子類,常用于訪問當(dāng)前類中的常量、靜態(tài)變量和方法。
類的常量和靜態(tài)屬性、方法類的常量在PHP中,存在著全局常量,使用define關(guān)鍵字定義。而在PHP5中,還可以在類中定義常量。類的常量不屬于任何的類的實(shí)例,只屬于類的本身,且不可修改。定義類的常量很簡(jiǎn)單,只需要使用const關(guān)鍵字進(jìn)行定義即可。對(duì)于類的常量的引用分為兩種情況:一種是在類的內(nèi)部進(jìn)行引用,另一種是在類的外部進(jìn)行引用。不管是何時(shí)進(jìn)行引用,都需要使用范圍解析操作符(::)。
<?php class Color { const RED = 'red'; const BLUE = 'blue'; const WHITE = 'white'; function getWhite() { // 內(nèi)部引用 return self::WHITE; } } // 外部引用 echo Color::RED; $obj = new Color(); echo $obj->getWhite();?>靜態(tài)屬性、方法
每一個(gè)類的實(shí)例都有其所有屬性和方法的拷貝,但類還可以定義靜態(tài)屬性和靜態(tài)方法。靜態(tài)屬性(方法)和類的常量一樣,只屬于類的本身,通過關(guān)鍵字static定義。訪問方式和類的常量一樣。
<?php class myClass { static $num = 0; function __construct() { self::$num++; } // 統(tǒng)計(jì)該類實(shí)例化的個(gè)數(shù) static function printNum() { echo self::$num . '<br/>'; } } myClass::printNum(); $a = new myClass(); myClass::printNum(); $b = new myClass(); myClass::printNum(); $c = new myClass(); myClass::printNum();?>訪問修飾符
在使用面向?qū)ο?/u>的程序設(shè)計(jì)模式進(jìn)行開發(fā)時(shí),最為重要的一點(diǎn)就是封裝和對(duì)象屬性的訪問保護(hù),而訪問修飾符就是因此誕生的。通常對(duì)于類屬性和方法,訪問保護(hù)都是通過3個(gè)關(guān)鍵字來實(shí)現(xiàn)的:public、protected和private。在開發(fā)時(shí),需要制定屬性或方法的訪問權(quán)限,為了向下兼容,定義方法時(shí)未指定訪問權(quán)限將自動(dòng)設(shè)置為public(如定義屬性為指定會(huì)報(bào)錯(cuò))。
指定為public的類屬性和方法為公共的屬性和方法,可以在任何作用域內(nèi)訪問。在對(duì)象外可以采用對(duì)象名->屬性名(方法名)訪問,在對(duì)象內(nèi)部可以用$this->屬性名(方法名)訪問。若一個(gè)類從該類繼承,則這個(gè)類的對(duì)象的外部和內(nèi)部訪問該類屬性或者方法可以采用相同的方式。
指定為protected的類屬性和方法只能夠在對(duì)象內(nèi)部使用,即采用$this->(受保護(hù))屬性名(變量名)的方式進(jìn)行訪問。若一個(gè)類從該類繼承,則受保護(hù)的類屬性和方法也可以在類的對(duì)象的方法中采用如上方式訪問。
指定為private的類屬性和方法和protected類似,只能在對(duì)象內(nèi)部訪問,同時(shí)也不能在繼承類的實(shí)例對(duì)象中進(jìn)行訪問,因?yàn)樗接袑傩院头椒ㄔ诶^承的類中時(shí)看不到的。
總結(jié):public修飾定義可以從任何位置訪問到類屬性和方法;protected修飾符定義只能在類的內(nèi)部及該類子類中(繼承)進(jìn)行訪問;private修飾符定義只能在類的內(nèi)部進(jìn)行訪問。
魔術(shù)方法在PHP中,除了提供靜態(tài)方法外,還提供了幾個(gè)有用的魔術(shù)方法。這里的魔術(shù)方法包括前面所講的構(gòu)造函數(shù)__construct()、析構(gòu)函數(shù)__destruct(),以及字符串轉(zhuǎn)換函數(shù)__toString()和克隆函數(shù)__clone()。
字符串轉(zhuǎn)換函數(shù)__toString()當(dāng)用echo或者print輸出一個(gè)對(duì)象時(shí),將自動(dòng)調(diào)用__toString()方法(不覺得比var_dump()好用)
<?php class Child { public $name; public $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function __toString() { return $this->name . ' ' . $this->age . '<br/>'; } } $myChild = new Child('hanzichi', 10); print $myChild; echo $myChild; var_dump($myChild);?>克隆函數(shù)__clone()
在實(shí)際應(yīng)用中,除了采用new關(guān)鍵字創(chuàng)建對(duì)象外,還可以使用clone關(guān)鍵字實(shí)現(xiàn)對(duì)象克隆,所克隆的對(duì)象將擁有原對(duì)象的所有屬性。
<?php class Child { public $name; public $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function show() { echo $this->name . ' ' . $this->age . '<br/>'; } } $myChild = new Child('hanzichi', 10); $hisChild = clone $myChild; $hisChild->show(); // hanzichi 10?>
有些時(shí)候我們并不需要克隆完全一樣的對(duì)象,這時(shí)我們可以在類中定義__clone方法,克隆的時(shí)候會(huì)自動(dòng)調(diào)用。
<?php class Child { public $name; public $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function __clone() { $this->name = 'candy'; } function show() { echo $this->name . ' ' . $this->age . '<br/>'; } } $myChild = new Child('hanzichi', 10); $hisChild = clone $myChild; $hisChild->show(); // candy 10?>PHP編程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選