PHP中的坚实原则
#php #oop #solidprinciples

什么是固体?

您可能已经在几乎每个职位描述中都听过这个术语**SOLID**,并想知道为什么它很重要。稳固的原则是一组五种设计指南,旨在使软件设计更加易于理解,灵活和可维护。这些原理被广泛用于对象的编程中,尽管它们也可以在其他范式中应用。

坚固的柱子

首字母缩写固体代表:

  • 单个责任原则(SRP)
  • 开放原理(OCP)
  • Liskov替代原则(LSP)
  • 接口隔离原理(ISP)
  • 依赖性反转原理(DIP)

1)单一责任原则

班级应该只有一个理由或目的服务。这意味着班级应该只有一个责任。我将与PHP示例一一展示。

// Single Responsibility Principle

// Shouldn't do
class Report {
    public function generate() {
        // generating report
    }

    public function saveToFile($filename) {
        // save report to file
    }
}

// Should do
class Report {
    public function generate() {
        // generating report
    }
}

class ReportSaver {
    public function saveToFile(Report $report, $filename) {
        // save report to file
    }
}

2)开放原理

实例应开放以进行扩展,但要关闭以进行修改。这个平均实例(类,功能,模块等)可以通过另一个实例扩展,但不应直接修改它们。

// Open Close Principle

// Shouldn't do
class Rectangle {
    public $width;
    public $height;
}

function area($rectangle) {
    return $rectangle->width * $rectangle->height;
}

// Should do
interface Shape {
    public function area();
}

class Rectangle implements Shape {
    public $width;
    public $height;

    public function area() {
        // w * h
    }
}

class Circle implements Shape {
    public $radius;

    public function area() {
        // πr2
    }
}

3)Liskov替代原则

这意味着超类的对象应可以用子类的对象代替,而不会影响程序的正确性。这意味着什么?好吧,让我们看看澄清的示例代码。

// Liskov Substitution Principle

// Shouldn't do
class Animal {
    public function jump() {
        // code for jumping
    }
}

class Snail extends Animal {
    public function jump() {
        // Sanil can't jump
    }
}

// Good example
abstract class Animal {
    abstract public function eat();
}

class Snail extends Bird {
    public function eat() {
        // every animal can eat
    }
}

class Tiger extends Bird {
    public function eat() {
        // every animal can eat
    }
}

4)接口隔离原理

我们不应该强迫实例实现他们不使用的接口。我们应该在大多数情况下使接口灵活。

// Interface Segregation Principle

// Shouldn't do
interface Human {
    public function walk();
    public function swim(); // not everyone can swim
}

// Should do
interface Walkable {
    public function walk();
}

interface Swimmable {
    public function swim();
}

class People implements Walkable, Swimmable {
    public function walk() {
        // walking
    }

    public function swim() {
        // swimming
    }
}

5)依赖性反转原理

该原理旨在将低水平模块(提供基本功能)的高级模块(提供复杂的功能)解脱,通过引入它们之间的抽象层。这允许高级和低级模块依赖于抽象,而不是稳定的实现,从而使系统更加灵活,可扩展和可维护。

// Dependency Inversion Principle

// Shouldn't do
class Book {
    public function getContent() {
        // return contents
    }
}

class Printer {
    public function printBook(Book $book) {
        $content = $book->getContent();
        // print the content
    }
}

您可以在上面的示例中看到,打印机类取决于 book 对象,并且只能打印为 book 。如果还有另一个称为文章的类可能要打印怎么办?我们不应该修改打印机类以接受更多对象。相反,我们提供了它们之间的抽象。

// Dependency Inversion Principle

// Should do
interface Printable {
    public function getContent();
}

class Book implements Printable {
    public function getContent() {
        return "This is the book content";
    }
}

class Article implements Printable {
    public function getContent() {
        return "This is the article content";
    }
}

class Printer {
    public function printContent(Printable $printable) {
        $content = $printable->getContent();
        echo "Printing content: " . $content;
    }
}

在PHP中,这些原理有助于创建一个更容易调试,理解和扩展的干净代码库。鉴于PHP的应用通常会随着时间的流逝而发展,因此应用坚实的原理可以极大地减轻生长和维护的痛苦。