面向对象的5大原则

2020-11-23  本文已影响0人  lifefruity

SOLID
S:单一职责原则
功能单一,比如计算面积,就单单地返回值,不要返回json 或者 html

O:开闭原则
不要修改,需要扩展

L:里氏替换原则

/*
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
*/
class demo {
    public function f1($a, $b)
    {
        return $a-$b;
    }
}


class demo1 extends demo {
    public function f1($a, $b)
    {
        return $a+$b;
    }
    
    public function f2($a, $b)
    {
        return $this->f1($a, $b)+100;
    }
}


//在本例中,引用基类demo完成的功能,换成子类demo1之后,发生了异常
$demo = new demo();
echo '100-50='.$demo->f1(100,50)."<br>";//150
echo '150-50='.$demo->f1(150,50)."<br>";//200


$demo1 = new demo1();
echo '100-50='.$demo1->f1(100,50)."覆盖方法了错误<br>";//150
echo '150-50='.$demo1->f1(150,50)."覆盖方法了错误<br>";//200
echo '100+20+100='.$demo1->f2(100,20)."覆盖方法了错误<br>";//220

I:接口隔离原则
有个动物的接口,有fly()的功能,但是小鸟有飞的功能,小猪没有这个功能。所以应该有2个接口,一个是会飞的接口,一个是最基础的动物接口。那么小鸟需要实现这2个接口,小猪实现最基础那个就行。

D:依赖反转原则
有个登录的方法,这样是不合理的,因为依赖了MySQLConnection,如果不用mysql,换了其它数据库,还需要去修改它,其实也违反了开闭原则

class Login{
    private $dbConnection;

    public function __construct(MySQLConnection $dbConnection) {
        $this->dbConnection = $dbConnection;
    }
}

正确的方法应该是针对接口编程

class Login{
    private $dbConnection;

    public function __construct(DBConnectionInterface $dbConnection) {
        $this->dbConnection = $dbConnection;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读