How can the use of classes and strategies in PHP improve the organization and readability of code related to product availability calculations?

Using classes and strategies in PHP can improve the organization and readability of code related to product availability calculations by encapsulating the logic within separate classes, making it easier to manage and maintain. By defining different strategies for calculating availability, we can easily switch between them without changing the core logic of the application.

<?php

interface AvailabilityCalculationStrategy {
    public function calculateAvailability($product);
}

class DefaultAvailabilityCalculation implements AvailabilityCalculationStrategy {
    public function calculateAvailability($product) {
        // Default availability calculation logic
        return $product->stock - $product->reserved;
    }
}

class AdvancedAvailabilityCalculation implements AvailabilityCalculationStrategy {
    public function calculateAvailability($product) {
        // Advanced availability calculation logic
        return $product->stock - $product->reserved - $product->pendingOrders;
    }
}

class Product {
    public $stock;
    public $reserved;
    public $pendingOrders;

    public function __construct($stock, $reserved, $pendingOrders) {
        $this->stock = $stock;
        $this->reserved = $reserved;
        $this->pendingOrders = $pendingOrders;
    }

    public function calculateAvailability(AvailabilityCalculationStrategy $strategy) {
        return $strategy->calculateAvailability($this);
    }
}

// Example usage
$product = new Product(100, 10, 5);
$defaultStrategy = new DefaultAvailabilityCalculation();
$advancedStrategy = new AdvancedAvailabilityCalculation();

echo "Default availability: " . $product->calculateAvailability($defaultStrategy) . "\n";
echo "Advanced availability: " . $product->calculateAvailability($advancedStrategy) . "\n";

?>