欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP-抽象类和接口-笔记

程序员文章站 2024-02-19 15:10:04
...

抽象类的目的

抽象类无法被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();
?>

显示:

我吃面包
我会跳

相关标签: PHP 笔记