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