1. 程式人生 > >PHP-抽象類和介面-筆記

PHP-抽象類和介面-筆記

抽象類的目的

抽象類無法被new例項化,作用相當於一個模板,就是為了給子類繼承,交由子類完成規定的功能

抽象方法

抽象方法沒有方法體,它的實現必須由子類完成,不全部實現則報錯

關鍵字:abstract

注意:

1.在抽象類中定義抽象方法要加修飾符abstract,否者將不是抽象方法,是什麼方法由該方法前面的修飾符決定,預設為public

2.如果定義的方法不為抽象方法,該方法的繼承就和一般的類一樣,子類會繼承該方法(即使子類中沒有寫),並能夠呼叫

3.抽象方法只能由publicprotected修飾

4.abstract不能與private,static,final,native並列修飾同一個方法

5.子類在實現抽象方法的時候要嚴格按照抽象方法的格式(抽象方法有引數,則子類的方法也要有引數,引數有預設值,子類的方法也要有預設值)

例:抽象方法 abstract public function A();  ==> 子類的方法 public function A() {}

抽象方法 abstract public function A($a);  ==> 子類的方法 public function A($a) {}

抽象方法 abstract public function A($a = 0);  ==> 子類的方法 public function A($a = 1) {}

6.抽象類可以被抽象類繼承,並且子類一併全部實現其中的抽象方法

原始碼:

<?php
	abstract class Person
	{
		public $name;
		function say()
		{
			echo "說什麼<br />";
		}

		abstract public function eat($name);//抽象方法沒有方法體,方法本身由子類實現,即一定被子類重寫

	}

	//$p = new Person();  抽象類無法被new例項化
	//抽象類的目的是為了子類的繼承
	
	class Man extends Person
	{
		public function eat($name)
		{
			echo "我吃了什麼<br />";
		}
	}

	$p = new Man();
	$p->say();//呼叫了非abstract的say()方法
	$p->eat(123);//呼叫子類重寫的abstract方法

	//判斷say()方法的修飾符
	$f = new ReflectionMethod('Person', 'say');
	$s=Reflection::getModifierNames($f->getModifiers());
	print_r($s);

	//抽象類可以繼承抽象類,並且子類也都要全部實現
?>

顯示:

說什麼 我吃了什麼 Array ( [0] => public )

介面關鍵字:

interfac:介面

implements:實現

注意:

1.介面中的方法都是public修飾

2.介面中不可以定義屬性,但是可以定義常量,介面常量和類常量使用一樣,但是無法被子類和子類介面覆蓋

3.一個類可以實現多個介面,中間使用逗號隔開

4.實現多個介面時,介面中的方法不能重名

5.類可以先繼承在實現介面

6.介面可以繼承介面(關鍵字:extends),但方法都要實現

原始碼:

<?php
	//interfac:介面
	//implements:實現
	
	interface Eat
	{
		function eatMianbao();
	}
	interface Jump
	{
		function jumpp();
	}

	class Person implements Eat,Jump
	{
		function eatMianbao()
		{
			echo "我吃麵包<br />";
		}
		function jumpp()
		{
			echo "我會跳<br />";
		}
	}

	$p = new Person();
	$p->eatMianbao();
	$p->jumpp();
?>

顯示:

我吃麵包 我會跳