面向对象,是当今编程的主流,对于研发人员,可能对面向对象,多多少少的有一些认识,但是有些不常用的或许不是特别清楚。有时也是很有用的。下面就介绍几点知识。
一、final 关键字的一些知识:
1、final 关键字作为方法是可以被子类继承的。如下面:
class A{
final function operation(){
echo 'a';
}
}
class B extends A{
}
$a=new B();
$a->operation();
result :a
2、final 关键字作为类是不可以继承的,如下:
<?php
final class A{
final function operation(){
echo 'a';
}
}
class B extends A{
}
$a=new B();
$a->operation();
会有如下错误:
( ! ) Fatal error: Class B may not inherit from final class (A) in D:\wamp\www\examble\index19.php on line 9
3、final 关键字作为的方法不能被子类覆盖,也就是说子类不能有相同的方法,如下
class A{
final function operation(){
echo 'a';
}
}
class B extends A{
function operation(){
echo 'a';
}
}
$a=new B();
$a->operation();
会有如下错误:
( ! ) Fatal error: Cannot override final method A::operation() in D:\wamp\www\examble\index19.php on line 12 |
---|
二、php 多重继承的实现,以下的例子在php 中将会有个致命的错误。
class A{
public function operation(){
echo 'a';
}
}
class C{
public function oper(){
echo 'c';
}
}
class B extends A{
public function operation(){
echo 'a';
}
}
class B extends C{
public function operati(){
echo 'd';
}
}
$a=new B();
$a->operation();
( ! ) Fatal error: Cannot redeclare class B in D:\wamp\www\examble\index19.php on line 24 |
---|
这种形式的多种继承不被允许的。
如果非要实现多种继承,那么只能通过接口的方式实现呢。
interface Displayable{
public function display();
}
interface B{
public function show();
}
class A implements Displayable,B{
public function display(){
echo 'a';
}
public function show(){
echo 'b';
}
}
$ab=new A();
$ab->display();
$ab->show();
注意接口的方法都是public,接口的方法只有方法,没有方法体,子类重写接口的方法,接口的方法在子类必须都被重写。
三、 延迟静态绑定
php 5.3 引进了延迟静态绑定的概念是,该特性是允许在一个静态继承的上下文中对一个被调用类的引用。也就是说父类可以使用子类重载的静态方法。如下所示:
class A{
public static function who(){
echo __CLASS__;
}
public static function test(){
static::who();
}
}
class B extends A{
public static function who(){
echo __CLASS__;
}
}
A::test(); 输入B
php 手册有更多的介绍。
四,抽象类与接口的区别
抽象方法与接口有相同之处,都是只有方法名,没有方法体。
抽象方法的类必须是抽象类。
抽象方法与接口的方法,在子类都必须去实现。
抽象方法不支持多继承,接口可以实现多重继承。
抽象类不能继承抽象类。
接口能继承接口如下。
<?php
interface a{
public function e();
}
interface b extends a{
public function b();
}
class c implements b{
public function b(){
echo 'fddfdf';
}
public function e(){
echo 'fddf';
}
}
$c=new c();
$c->b();
|