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;
}
}
网友评论