首頁  >  文章  >  後端開發  >  PHP類別實例教學:abstract類別和abstract方法

PHP類別實例教學:abstract類別和abstract方法

WBOY
WBOY原創
2016-08-08 09:26:37814瀏覽

可以使用abstract來修飾一個類別或方法。

用abstract修飾的類別表示這個類別是一個抽象類別,用abstract修飾的方法表示這個方法是一個抽象方法。

抽象類別不能被實例化。

抽象方法是只有方法聲明,而沒有方法的實作內容。

abstract 抽象類別

可以使用abstract來修飾一個類別。

用abstract修飾的類別表示這個類別是抽象類別。

抽象類別不能被實例化。

這是一個簡單抽象的方法,如果它被直接實例化,系統會報錯。

<?php
//定义一个抽象类
abstract class User
{
	public function __toString() {
		return get_class($this);
	} 
}
//实例化这个类会出现错误
echo new User();
?>
 下面範例的 NormalUser 繼承自 User類,就可以被實例化了。
<?php
//定义一个抽象类
abstract class User
{
	public function __toString() {
		return get_class($this);
	} 
}
//实例化这个类会出现错误
echo new User();
class NormalUser extends User
{
}
$a = new NormalUser();
echo "这个类" . $a . "的实例";
?>
 單獨設定一個抽象類別是沒有意義的,只有有了抽象方法,抽象類別才有了血肉。下面介紹抽象方法。

abstract 抽象化方法

用abstract修飾的類別表示這個方法是抽象方法。

抽象方法,只有方法的聲明部分,沒有方法體。

抽象方法沒有 {} ,而採用 ; 結束。

一個類別中,只要有一個抽象方法,這個類別必須被宣告為抽象類別。

抽象方法在子類別中必須被重寫。

下面是一個抽象類,其中有兩個抽象方法,分別是 setSal() 和 getSal()。用來取回 $sal 員工的薪水。

<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用 ; 号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
} 
?>
 既然User類別不能被直接繼承,我們寫一個NormalUser類別繼承自User類別。當我們寫成以下程式碼時,系統會報錯。 這個錯誤告訴我們,在 User類別中有兩個抽象方法,我們必須在子類別中重寫這兩個方法。
<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用 ; 号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
class NormalUser extends User
{
}
?> 
 下面例子,重寫了這兩個方法,雖然方法體裡面 {} 的內容是空的,也算重寫了這個方法。注意看重寫方法的參數名稱,這裡只要參數數量一致就可以,不要求參數的名稱必須一致。
<?php
abstract class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用;号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
class NormalUser extends User
{
	function getSal() {
	}
	function setSal($sal) { 
	}
}
	//这样就不会出错了。
?>
下面19-21行,三種寫重寫的方式都會報錯。

19行,缺少參數。

20行,參數又多了。

21行,參數類型不對。 (這種寫法在以後章節介紹)

一個類別中,如果有一個抽象方法,這個類別必須被宣告為抽象類別。

下面這個類別不是抽象類,其中定義了一個抽象方法,會報錯。

<?php
class User
{
	protected $sal = 0;
	//这里定义的抽象方法。
	//注意抽象方法没有方法体,而且方法结束使用;号。
	abstract function getSal();
	abstract function setSal();
	//定义它的__tostring方法
	public function __toString() {
		return get_class($this);
	} 
}
	//这个类中有两个抽象方法,如果这个类不是抽象的。会报错
?>

 抽象類別繼承抽象類別

抽象類別繼承另一個抽象類別時,不用重寫其中的抽象方法。

抽象類別中,不能重寫抽象父類別的抽象方法。

這樣的用法,可以理解為對抽象類別的擴充

下面的例子,示範了一個抽象類別繼承自另外一個抽象類別時,不需要重寫其中的抽象方法。

<?php  
abstract class User  
{  
    protected $sal = 0;  
    abstract function getSal();  
    abstract function setSal($sal);   
}  
abstract class VipUser extends User  
{  
}  
?>  

 抽象類別在被繼承後,其中的抽象方法不能被重寫。

如果發生重寫,系統會報錯。

<?php
abstract class User
{
	protected $sal = 0;
	abstract function getSal();
	abstract function setSal($sal); 
}
abstract class VipUser extends User
{
	abstract function setSal(); 
}
?>

 抽象類別繼承抽象類別,目的對抽象類別的擴展。

<?php
abstract class User
{
	protected $sal = 0;
	abstract function getSal();
	abstract function setSal($sal); 
}
abstract class VipUser extends User
{
	protected $commision = 0;
	abstract function getCommision();
	abstract function setCommision();
}
?>

 在PHP5.1中,在抽象類別中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實作這個方法時,必須是靜態的方法。

靜態抽象方法

在PHP5.1中,在抽象類別中支援靜態抽象方法。下面這個例子,看到靜態抽象方法可以宣告。實作這個方法時,必須是靜態的方法。

<?php
abstract class User
{
	protected static  $sal = 0;
	static abstract function getSal();
	static abstract function setSal($sal); 
}
class VipUser extends User
{
	static function getSal() {
		return self::$sal;
	}
	static function setSal($sal) {
		self::$sal = $sal;
	}
}
VipUser::setSal(100);
echo "you sal is " . VipUser::getSal();
?>
//这里的抽象方法好像没有问题 

轉自:http://blog.csdn.net/klinghr/article/details/5212952

以上就介紹了PHP類別實例教學:abstract類別和abstract方法,包含了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn