本文实例讲述了php抽象类与接口的区别。分享给大家供大家参考,具体如下:
抽象类abstract
概念
定义为抽象的类不能被实例化。任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,这些方法的访问控制必须喝父类中一样或者更为宽松。
例如,某个抽象方法被声明为proteced,那么子类中的实现,就应该声明为protected或者public,而不能定义为private。
方法的调用方式必须匹配,即类型和所需参数数量必须一致,例如,子类定义了一个可选参数,而父类抽象方法中没有声明,则两者的声明并没有冲突。
特点
抽象类继承,使用关键字extends。抽象类可以声明各种变量、常量、方法。抽象类可以有构造函数。抽象类中的方法可以是公开的public、保护的protected、私有的private。一个类只能继承一个抽象类。示例
示例一
<?php// 抽象类abstract class abstractclasss{ // 强制要求子类定义这些方法 abstract protected function getvalue(); abstract protected function prefixvalue(); // 普通方法(非抽象方法) public function printout() { print $this->getvalue() . "\n"; }}// 子类class concreteclassone extends abstractclass{ protected function getvalue() { return "concreteclassone"; } public function prefixvalue我真棒作文s($prefix) { return "{$prefix}concreteclassone"; }}// 子类class concreteclasstwo extends abstractclass{ protected function getvalue() { return "concreteclasstwo"; } public function prefixvalue($prefix) { return "{$prefix}concreteclasstwo"; }}// 实例化第一个子类$classone = new concreteclassone;$classone->printout();echo $classone->preculturefixvalue('foo_') . "\n";// 实例化第二个子类$classtwo = new concreteclasstwo;$爱情真善美歌曲classtwo->printout();echo $classtwo->prefixvalue('foo_') . "\n";结果输出
concreteclassone
foo_concreteclassoneconcreteclasstwo
foo_concreteclasstwo
示例二
<?php// 抽象类abstract class abstractclass{ // 我们的抽象方法仅需要定义需要的参数 abstract protected function prefixname($name);}// 子类class concreteclass extends abstractclass{ // 我们的子类可以定义父类签名中不存在的可选参数 public function prefixname($name, $parator = ".") { if ($name == "pacman") { $prefix = "mr"; } elif ($name == "pacwoman") { $prefix = "mrs"; } el { $prefix = ""; } return "{$prefix}{$parator} {$name}"; }}// 实例化子类$class = new concreteclass;echo $class->prefixname("pacman") . "\n";echo $class->prefixname("pacwoman") . "\n";结果输出
mr. pacman
mrs, pacwoman
接口interface
概念
使用接口interface,可以指定某个类必须实现那些方法,但是不需要定义这些方法的具体内容。
要实现一个接口,使用implements操作符,类中必须实现接口中定义的所有方法。
特点
接口的实现,使用关键字implements。接口中不能声明变量,但是可以声明常量。接口中没有构造函数。接口中的方法默认都是公开的public。一个类可以实现多个接口。示例
示例一 、 实现接口
<?php// 声明一个itemplate接口interface itemplate{ public function tvariable($name, $var); public function gethtml($template);}// 实现接口// 下面的写法是正确的class template implements itemplate{ private $vars = array(); public function tvariable($name, $var) { $this->vars[$name] = $var; } public function gethtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template); } return $template; }}// 下面的楷书写法是错误的,会报错,因为没有实现 gethtml()// fatal error: class badtemplate contains 1 abstract methonds// and must therefore be declared abstaract (itemplate::gethtml)class badtemplate implement中华复兴社s itemplate{ private $vars = array(); public function tvariable($name, $var) { $this->vars[$name] = $var; }}示例二 、 可扩充接口
<?phpinterface a{ public function foo();}interface b extends a{ public function baz(baz $baz);}// 正确的写法class c implements b{ public function foo() { } public function baz(baz $baz) { }}// 错误的写法会导致一个致命的错误class d implements b{ public function foo() { } public function baz(foo $foo) { }}示例三 、 继承多个接口
<?phpinterface a{ public function foo();}interface b{ public function bar();}interface c extends a, b{ public function baz();}class d implements c{ public function foo() { } public function bar() { } public function baz() { }}示例四 、使用接口常量
<?phpinterface a{ const b = 'interface constant';}// 输出接口变量echo a:b;// 错误的写法,因为常量不能被覆盖。// 接口常量的概念和类常量的是一样的。class b implements a{ const b = 'class constant'}更多关于php相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《php数组(array)操作技巧大全》、《php基本语法入门教程》、《php运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家php程序设计有所帮助。
本文发布于:2023-04-07 08:50:56,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/7874a4d2d92d28cb3510af6b55d4cd11.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP抽象类与接口的区别实例详解.doc
本文 PDF 下载地址:PHP抽象类与接口的区别实例详解.pdf
| 留言与评论(共有 0 条评论) |