美文网首页
面向对象的5大原则

面向对象的5大原则

作者: lifefruity | 来源:发表于2020-11-23 17:03 被阅读0次

    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:面向对象的5大原则

          本文链接:https://www.haomeiwen.com/subject/ljsviktx.html