Определение - программные сущности должны быть открыты к расширению и закрыты для изменений (можем изменить поведение без изменения исходного кода).
Пример нарушения:
<?php
interface Shape
{
}
class Square implements Shape
{
}
class Circle implements Shape
{
}
class ShapeDrawer
{
public function draw(Shape ...$shapes)
{
foreach ($shapes as $shape) {
if ($shape instanceof Square) {
$this->drawSquare($shape);
} elseif ($shape instanceof Circle) {
$this->drawCircle($shape);
}
}
}
private function drawSquare(Square $square)
{
// some code
}
private function drawCircle(Circle $circle)
{
// some code
}
}
$shapes = [new Square(), new Circle()];
$drawer = new ShapeDrawer();
$drawer->draw(...$shapes);
Получается при добавлении новых фигур - нам придется изменять метод draw, и класс ShapeDrawer.
Чтобы этого избежать - мы можем переписать наш код следующим образом:
<?php
interface Shape
{
public function draw(): void;
}
class Square implements Shape
{
public function draw(): void
{
// some code
}
}
class Circle implements Shape
{
public function draw(): void
{
// some code
}
}
class ShapeDrawer
{
public function draw(Shape ...$shapes)
{
foreach ($shapes as $shape) {
$shape->draw();
}
}
}
$shapes = [new Square(), new Circle()];
$drawer = new ShapeDrawer();
$drawer->draw(...$shapes);