PHP實踐之路(九)類與物件(2)

cyxlzzs發表於2013-07-08

PHP實踐之路(目錄索引)

類與物件(2)

1、建構函式

a、建構函式的作用主要是初始化物件資訊,每次建立新物件時都會呼叫建構函式

b、建構函式模式為

void __construct($args)

c、為了實現向後相容性,如果 PHP 5 在類中找不到 __construct() 函式,它就會嘗試尋找舊式的建構函式,也就是和類同名的函式

d、如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫 parent::__construct()。子類和父類的說法是在繼承中有的,繼承我們將在後面討論(這個實驗我們將在繼承中體現)

我們來舉個例子

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}
//賬戶
class Account{
	private $username;
	private $password;
	
	//建構函式
	function __construct($name,$pass){
		println("execute construct...");
		$this->username=$name;
		$this->password=$pass;
	}
	
	function printInfo(){
		println("username:".$this->username);
		println("password:".$this->password);
	}
}

$account=new Account("cyxl","123");			//輸出:execute construct...

$account->printInfo();
/**輸出
username:cyxl
password:123
*/

class Account2{
	private $username;
	private $password;
	
	//舊式同名建構函式
	function Account2($name,$pass){
		println("execute construct...");
		$this->username=$name;
		$this->password=$pass;
	}
	
	function printInfo(){
		println("username:".$this->username);
		println("password:".$this->password);
	}
}

$account=new Account2("jack","123");			//輸出:execute construct...
$account->printInfo();
/**輸出
username:jack
password:123
*/
?>


2、解構函式

a、解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行(自PHP5開始引入解構函式)

b、父類的解構函式不會被引擎暗中呼叫。要執行父類的解構函式,必須在子類的解構函式體中顯式呼叫 parent::__destruct()。(這個實驗我們將在繼承中體現)

c、解構函式即使在使用exit()終止指令碼執行時也會被呼叫。在解構函式中 呼叫exit()將會中止其餘關閉操作的執行

實驗時間

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}
//賬戶
class Account{
	private $username;
	private $password;
	
	//建構函式
	function __construct($name,$pass){
		println("execute construct...");
		$this->username=$name;
		$this->password=$pass;
	}
	
	function printInfo(){
		println("username:".$this->username);
		println("password:".$this->password);
	}
	
	function __destruct(){
		println("execute destruct...");
	}
}

$account=new Account("cyxl","123");			//輸出:execute construct...
///exit();								//如果此處呼叫exit()函式,指令碼將終止執行,但物件的解構函式還是會執行輸出:execute destruct...
$account->printInfo();
/**輸出
username:cyxl
password:123
*/

//指令碼執行完後,系統自動呼叫解構函式輸出:execute destruct...
?>

3、繼承

a、繼承也就是子類繼承自父類,子類將會繼承父類的所有公有和保護方法,但是子類的方法會覆蓋父類的方法。這個可以聯絡實際情況加以理解
b、一個子類只可以繼承一個父類
c、使用final關鍵字修飾的類不能被繼承,使用final修飾的方法不能被覆蓋
好了,我們做做實驗吧
<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}
class Father{
	private $name;
	protected $money;
	public $friends;
	
	//建構函式初始化物件
	function __construct(){
		println("father construct executed...");
		$this->name="father";
		$this->money=10000.0;				//父親的初始財富值,也許是他爸爸留給他的
		$this->friends=array("jack","lily");
	}
	function work(){
		println("father working..");
		$this->money+=10;					//父親通過工作掙錢
	}
	
	function printInfo(){
		println("name:".$this->name);
		println("money:".$this->money);
		echo "friends:";
		foreach($this->friends as $friend){
			echo $friend." ";
		}
		echo "<br />";
	}
	
	function __destruct(){
		println("father gone");
	}
}

class Sun extends Father{
	private $name;
	private $other;
	
	function __construct(){
		println("sun construct executed...");
		parent::__construct();		//如果沒有這行顯示的呼叫父類的建構函式,那麼父類的建構函式將不會執行
		$this->name="sun";			//兒子自己的名字
		$this->other="somthing else";
	}
	
	function work(){
		println("sun working..");
		$this->money+=20;			//兒子繼承了父親的財產,通過自己掙錢使財富值增加了(兒子掙錢的能力比父親強)
	}
	//兒子有自己的朋友
	function makeFriends(){
		$this->friends=array("mike","tom","bake");
	}

	function printInfo(){
		println("name:".$this->name);
		println("money:".$this->money);
		println("other:".$this->other);
		echo "friends:";
		foreach($this->friends as $friend){
			echo $friend." ";
		}
		echo "<br />";
	}
	
	function __destruct(){
		parent::__destruct();
		println("sun gone");
	}
}
//定義父親物件
$father=new Father();
$father->work();
$father->printInfo();
println("========================");
//定義兒子物件,很多屬性都繼承自父親
$sun=new Sun();
$sun->printInfo();
println("========================");
$sun->work();
$sun->makeFriends();

$sun->printInfo();
println("========================");
//接下來是系統自動銷燬物件
?>

以上程式的輸出結果為
father construct executed...
father working..
name:father
money:10010
friends:jack lily 
========================
sun construct executed...
father construct executed...
name:sun
money:10000
other:somthing else
friends:jack lily 
========================
sun working..
name:sun
money:10020
other:somthing else
friends:mike tom bake 
========================
father gone
sun gone
father gone


版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章