PHP實踐之路(十)類與物件(3)

cyxlzzs發表於2013-07-25

PHP實踐之路(目錄索引)


類與物件(3)

1、抽象類

a、在class前面加上abstract關鍵字類宣告一個抽象類,在方法上面加上abstract關鍵字來定義抽象方法

b、抽象類不能直接被例項化,你必須先繼承該抽象類,然後再例項化子類

c、抽象類中至少要包含一個抽象方法。如果類方法被宣告為抽象的,那麼其中就不能包括具體的功能實現

d、繼承一個抽象類的時候,子類必須實現抽象類中的所有抽象方法

e、繼承父類的抽象方法時,訪問控制必須寬鬆於父類。寬鬆程度由大到小依次為public>protected>private

實驗一下

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}	
abstract class Father
{
	abstract function fun1();		//抽象方法只宣告,不實現
	abstract protected function fun2();
	function fun3(){
		println("I am not abstract method...");
	}
	private function fun4(){
		println("private method...");
	}
}

class Child extends Father
{
	//父類中fun1預設的可見性為public,所以子類中該方法的可見性必須為public
    function fun1(){
		println("fun1 executed...");
	}
	//?此處可見性為protected時將報錯,我的php版本為php-5.4.7
	function fun2(){
		println("fun2 executed...");
	}
}

$obj=new Child();

$obj->fun1();		//fun1 executed...
$obj->fun2();		//fun2 executed...
$obj->fun3();		//I am not abstract method...
//$obj->fun4();		//父類私有方法不能繼承

?>


按照API文件介紹抽象方法子類的可見性可與父類一樣,但這裡的fun2如果採用protected則報錯,這是為什麼呢?請知情者指教

2、介面


a、介面使用interface關鍵字宣告

b、介面可以理解為類裡所有方法都是抽象方法的抽象類,也就是所有方法都只含宣告,沒有實現(但並不用abstract來宣告方法)

c、介面中定義的所有方法都必須是public

d、使用implements關鍵字來實現介面,一個類可以實現多個介面。實現多個介面時,介面中的方法不能有重名

e、介面也可以繼承,通過使用extends操作符

接下來實驗時間

<?php
//換行輸出
function println($var){
	echo $var;
	echo "<br />";
}	
//定義一個介面動物
interface Animal{
	function walk();
	function eat();
}
//定義一個介面人繼承自動物
interface Person extends Animal{
	function talk();
}

//定義一個介面中國人
interface Chinese{
	function work();
}
//定義一個類,實現了Person和Chinese兩個介面,必須實現兩個介面中的所有方法
class ChineseWorker implements Person,Chinese{
	function walk(){
		println("walking...");
	}
	function eat(){
		println("eating...");
	}
	function talk(){
		println("talking...");
	}
	function work(){
		println("working in china...");
	}
}

$worker=new ChineseWorker();

$worker->walk();		//walking...
$worker->eat();			//eating...
$worker->talk();		//talking...
$worker->work();		//working in china...

?>


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

相關文章