天天看点

一文搞懂PHP中面向对象的三大特征

面向对象三大特征

很多资料说面向对象有三条特征是封装,继承多态。

但是抽象也是面向对象中的一个特征。

抽象

去定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板)。这种研究问题的方法称为抽象。

封装

封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。

继承

继承可以解决代码复用,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过

class 子类名 extends 父类名{
}
           

这样,子类就会自动拥有父类定义的属性和方法。

多态

函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。

传统的重载

class  A{

	public function test1(){
	echo “test1”;
}
public function test1($a){
	echo “test1 hello”;
}
}
$a =new A();
**没有传入参数则调用test1(){}
$a->test1();
**传入参数则调用test1($a){}
$a->test1(456);

           

上面这种写法在php中会报错。PHP是弱类型语言,因此PHP不支持多态。但是PHP有自己的重载方法来模拟多态。

PHP中的“重载”与其它绝大多数面向对象语言不同。传统的“重载”是用于提供多个同名的类方法,但各方法的参数类型和个数不同。

使用魔术方法__call

__call 是它一个对象调用某个方法,而该方法不存在,则系统会自动调用__call

<?php

class  A{

    public function test1($p){
        echo "接收一个参数<br/>";

    }
    public function test2($p){
        echo "接收两个参数<br/>";

    }


    //这些提供一个__call
    //__call 是它一个对象调用某个方法,而该方法不存在,则
    //系统会自动调用__call
    function __call($method,$p){
        var_dump($p);
        if($method=="test"){
            if(count($p)==1){
                $this->test1($p);
            }else if(count($p)==2){
                $this->test2($p);
            }
        }
    }

}

$a=new A();
$a->test(1); //结果:接收一个参数

$a->test(56,90);//结果:接收二个参数

?>

           

关于属性的重载php也有自身的方法来实现。

php重载