Задать вопрос
ddv88
@ddv88
Binance Futures

Определение значений передаваемой в функцию переменной типа массив?

Можно ли каким то образом, через интерфейс или абстракцию (встроенными средствами) объявить ключи принимаемой в функции переменной типа массив?

interface Parameters
{

    public $array = [
        "key_1" => "value_1",
        "key_2" => "value_3",
        "key_3" => "value_3",        
    ]
}

class Main implements Parameters
{

    public function execute(Parameters $array): string ¯\_(ツ)_/¯
    {
        
    }
}
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@tukreb
Можно сделать абстракции для проверки так:
class ParametersContainer
{
     private Parameters  $parameters;
    
     public function __construct(Parameters $parameters)
    {
        $this->parameters = $parameters;
    }
}
class Parameters
{
    private array $parameters = [];
    
    public function __construct(array $parameters = [])
    {
        //здесь проверяешь на нужные ключи и выбрасываешь исключение, если не подходят
        $this->parameters = $parameters ;
    }
}

Ну и где-то в коде:
$paramersContainer = new ParametersContainer(new Parameters($array));
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Можно через наследование ArrayObject, при этом сохранится доступ как к массиву и можно итерировать по объекту. Однократный перебор ключей массива всё равно понадобится, чтобы оставить только строковые ключи.
declare(strict_types=1);

abstract class StrictArray extends ArrayObject
{
    final public function __construct(array $array = []) {
        $this->checkArray(
            ...array_filter(
                $array,
                static fn(int|string $key): bool => is_string($key),
                ARRAY_FILTER_USE_KEY,
            ),
        );
        parent::__construct(array: $array);
    }

    #[Override]
    public function append(mixed $value): void
    {
        // Заглушка для запрета добавления значения в массив
    }

    #[Override]
    public function offsetSet(mixed $key, mixed $value): void
    {
        // Заглушка для запрета установки значения по ключу
    }
}

final class Parameters extends StrictArray
{
    protected function checkArray(
        int $keyInt,
        string $keyString,
        bool $keyBool = false,
        ?DateTimeImmutable $keyDate= null,
    ): void {
    }
}

$parameters = new Parameters([
    'keyInt' => 1,
    'keyDate' => new DateTimeImmutable('now'),
    'keyBool' => true,
    'keyString' => 'abc'
]);

Не очень красиво, что в StrictArray не определяется сигнатура для checkArray, но PHP не умеет перегружать методы с разными наборами параметров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы