BehavioralPHPverifiedVerified

Visitor Pattern in PHP

Lets you add new operations to an object structure without modifying the objects themselves, by separating the algorithm from the object structure it operates on.

How to Implement the Visitor Pattern in PHP

1Step 1: Define the visitor interface

interface Visitor
{
    public function visitCircle(Circle $circle): string;
    public function visitRectangle(Rectangle $rectangle): string;
}

2Step 2: Define elements that accept visitors

interface Shape
{
    public function accept(Visitor $visitor): string;
}

class Circle implements Shape
{
    public function __construct(public readonly float $radius) {}

    public function accept(Visitor $visitor): string
    {
        return $visitor->visitCircle($this);
    }
}

class Rectangle implements Shape
{
    public function __construct(
        public readonly float $width,
        public readonly float $height,
    ) {}

    public function accept(Visitor $visitor): string
    {
        return $visitor->visitRectangle($this);
    }
}

3Step 3: Implement concrete visitors

class AreaCalculator implements Visitor
{
    public function visitCircle(Circle $circle): string
    {
        $area = M_PI * $circle->radius ** 2;
        return "Circle area: {$area}";
    }

    public function visitRectangle(Rectangle $rectangle): string
    {
        $area = $rectangle->width * $rectangle->height;
        return "Rectangle area: {$area}";
    }
}

class SvgExporter implements Visitor
{
    public function visitCircle(Circle $circle): string
    {
        return "<circle r=\"{$circle->radius}\"/>";
    }

    public function visitRectangle(Rectangle $rectangle): string
    {
        return "<rect width=\"{$rectangle->width}\" height=\"{$rectangle->height}\"/>";
    }
}

// Usage
$shapes = [new Circle(5), new Rectangle(4, 6)];
$calc = new AreaCalculator();
foreach ($shapes as $shape) {
    echo $shape->accept($calc) . "\n";
}

Visitor Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Visitor Pattern in the Real World

Think of a tax auditor visiting different types of businesses—a restaurant, a law firm, a retail shop. The auditor (visitor) knows exactly what to examine at each type of business and applies the appropriate inspection procedure. The businesses (elements) simply let the auditor in; they don't change their own operations to accommodate the audit.