PHP抽象类和接口
在写一个通用的通知类时,遇到了问题,特此查看一下抽象类跟接口的异同点。
示例
interface a
{
function run();
}
interface b
{
const HELLO = "b: Hello, World!\n";
static function hello();
}
interface c extends a,b
{
public function info($str);
}
abstract class d implements c
{
public $hello = "d: hello, world!\n";
public function run(){
echo "d: run()\n";
self::hello();
}
static function hello(){
echo "d: hello()\n";
echo self::HELLO;
}
abstract function info($str);
}
abstract class e extends d
{
protected $info = "e: info\n";
private $msg;
private function setMsg($msg){
echo "e: setMsg()\n";
$this->msg = $msg;
}
protected function getMsg(){
echo "e: getMsg()\n";
if(is_null($this->msg)) $this->setMsg("e: msg\n");
return $this->msg;
}
public function dumpMsg(){
echo "e: dumpMsg()\n";
return $this->getMsg();
}
public function info($str){
echo "e: info\n";
echo $this->getMsg(), $this->msg($str);
}
abstract function msg($str);
}
class m extends e
{
public $msg = "m: msg\n";
public function msg($str){
echo "m: msg()\n";
echo $this->msg;
return str_replace("\n", ', ', $this->info . $this->getMsg() . $str) . "\n";
}
}
class n extends m
{
public function run(){
echo "n: run()\n";
parent::run();
echo $this->hello;
}
public function show(){
echo "n: show()\n";
$this->info('foo');
$this->msg('bar');
echo $this->msg;
echo $this->dumpMsg();
}
}
$obj = new n();
$obj->run();
echo "\n";
$obj->show();
异同
只要有一个方法为抽象方法,则这个类就是抽象类,抽象类是介于接口和类之间的特殊存在,是个“半成品”,不能实例化。
同
- 接口中的方法和抽象类中的抽象方法都要重写
- 重写的方法可访问权限不能变
异
- 接口
- 没有函数体
- 没有成员变量
- 所有方法都必须可访问
- 可继承多个接口
- 抽象类
- 抽象方法没有函数体
- 有成员变量
- 可以有受保护或者私有的属性和方法
- 可实现多个接口或者继承一个类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)