HEX
Server: LiteSpeed
System: Linux server315.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: globfdxw (6114)
PHP: 8.1.34
Disabled: NONE
Upload Files
File: /home/globfdxw/www/wp-content/plugins/give/src/Framework/Support/Currencies/GiveCurrencies.php
<?php

namespace Give\Framework\Support\Currencies;

use Money\Currencies;
use Money\Currency;
use Money\Exception\UnknownCurrencyException;

/**
 * Custom currencies implementation that uses GiveWP's currency list and filter.
 * Implements the Money library's Currencies interface to ensure Money operations
 * use GiveWP's configured currencies and decimal settings.
 *
 * @since 4.10.0
 */
class GiveCurrencies implements Currencies
{
    /**
     * @since 4.10.0
     */
    public function contains(Currency $currency): bool
    {
        $supportedCurrencies = array_keys(give_get_currencies_list());
        return in_array($currency->getCode(), $supportedCurrencies, true);
    }

    /**
     * @since 4.10.0
     */
    public function subunitFor(Currency $currency): int
    {
        if (!$this->contains($currency)) {
            throw new UnknownCurrencyException('Unknown currency: ' . $currency->getCode());
        }

        $currencies = give_get_currencies_list();
        $currencyData = $currencies[$currency->getCode()] ?? [];
        $decimals = $currencyData['setting']['number_decimals'] ?? 2;

        return (int) $decimals;
    }

    /**
     * Returns an iterator over all supported currencies.
     *
     * Uses yield (Generator) instead of ArrayIterator for better performance and memory efficiency:
     * - Lazy loading: Creates Currency objects only when needed during iteration
     * - Memory efficient: Doesn't load all 100+ Currency objects into memory at once
     * - Dynamic data: Based on give_get_currencies_list() which can change via filters
     * - Better performance: Especially important for large currency lists (100+ currencies)
     *
     * This approach is more suitable than ArrayIterator (used by BitcoinCurrencies/ISOCurrencies)
     * because GiveWP's currency list is dynamic and potentially large, unlike static ISO lists.
     *
     * @since 4.10.0
     */
    public function getIterator(): \Traversable
    {
        $supportedCurrencies = array_keys(give_get_currencies_list());

        foreach ($supportedCurrencies as $currencyCode) {
            yield new Currency($currencyCode);
        }
    }
}