您的位置:首页 > 编程语言 > PHP开发

php面向对象(三),抽象类,抽象方法,接口及php的”重载“

2016-02-15 11:52 627 查看
抽象类

定义:一个抽象的不能被实例化的类。

定义形式(
abstract
关键字):

[code]abstract class 类名{
    // ...
}


抽象方法

定义:一个只有方法头,没有方法体的方法

定义形式(用
abstract
修饰方法)

[code]abstract class 类名{
    abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略
}


抽象类和抽象方法的细节:

一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;

抽象类中可以没有抽象方法;

子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。

重载

含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如
java
)。

如:

[code]class A{
    function f(){

    }
    function f($a){

    }
    function f($a,$b){

    }
}


php中的重载

含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。

属性重载:

含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)

属性,本质就是一个变量,其有4个操作:

取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:
__get()


赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:
__set()


判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:
__isset()


判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:
__unset()


__set($属性名,值):

含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。

 这个方法结合
__get()
方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:

[code]class A{
    protected $prop_list = array();
    function __set($p,$v){
        $this->prop_list[$p] = $v;
    }
    function __get($p){
        return $this->prop_list[$p];
    }
}


__isset()

含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。

__unset()

含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。

方法重载

当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的
__call()
这个魔术方法;

当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的
__callstatic()
这个魔术方法。

php中实现通常的面向对象语言的“方法重载”(利用
__call()
__callstatic()
方法),如:

[code]<?php
class A{

    function __call($methodName,$arguments){
        switch ($methodName) {
            case 'f1': // 调用了f1这个不存在的方法
                # 调用了方法名为f1的这一系列重载方法
                if(count($arguments) == 0){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 1){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 2){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 3){
                    // 这里拿这些参数做这个方法的事情...
                }
                // ...
                break;
            case 'f2': // 调用了f2这个不存在的方法
                # 调用了方法名为f2的这一系列重载方法
                if(count($arguments) == 0){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 1){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 2){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 3){
                    // 这里拿这些参数做这个方法的事情...
                }
                // ...
                break;
            default:
                break;
        }
    }
}
?>


接口

定义形式

[code]interface 接口名{
    常量1;
    常量2;
    ...
    抽象方法1;
    抽象方法2;
    ...
}


说明:

接口中只有常量(接口常量)和抽象方法两种成员;

接口常量的使用形式为:
接口名称::常量名称


接口中的抽象方法,不要使用
abstract
修饰,也需要使用访问控制修饰符,因为其天然就是
Public


php
中接口和类一样也可以继承(接口继承接口)。

还谈php和java面向对象

相同点:

抽象类和抽象方法,及它们之间的细节都一样;

php的接口和java的接口都一样。

不同点:

重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: