@fomiash

Можно ли из оператора PHP match() получить только ключи или узнать существование ключа без выполнения соответствия?

Например:

$value = 'test';
$value = match($func) {
   'trim' => trim($value),
   'strrev' => strrev($value),
   'str_shuffle' => str_shuffle($value),
   // ...
   default => $value,
};

Просьба не обращать внимание на реализацию, так как это только пример, вместо функций может быть какая-то ресурсоемкая операция, создание класса и т.д. Необходимо узнать заранее, есть ли определенный ключ в match или нет. Дублирование в массив ключей не рассматриваю, так как нужно следить за их консистентностью (ключей match и массива).
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Зачем вам match?
$handlers = [
   'trim' => fn ($value) => trim($value),
   'strrev' => fn ($value) => strrev($value),
   'str_shuffle' => fn ($value) => str_shuffle($value),
];

if (array_key_exists($func, $handlers) {
  $value = $handlers[$func]($value);
} else {
  // Узнали, что ключа нет
}


Отвечая непосредственно на вопрос - простого способа получить варианты из оператора match нет. Может быть можно сделать это через рефлексию и точно это можно сделать через парсинг файла в AST, но зачем?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Как обычно, высокоинтеллектуальный вопрос из серии "помогите закрепить пилу на столе, а то она падает, когда я пытаюсь отпилить себе ногу!"

Судя по всему, для решения исходной задачи, какой бы она ни была, матч нужен как корове седло.
Но вы зачем-то пытаетесь его сюда вкрячить.
И единственным осмысленным ответом будет не использовать матч вовсе.
А осмысленным вопросом будет описать исходную задачу, для которой понадобилось это извращение.

К примеру, для приведенного кода матч сто лет в обед не нужен, достаточно одного массива
$match = [
   'trim',
   'strrev',
   'str_shuffle',
];
$value = in_array($func, $match) ? $func($value) : $value;


Но судя по всему, вы пишете какой-то динамический код, что-то вроде роутера.
То есть нормальным вариантом будет не это колупание с массивами, а нормальный класс с методами и проверка method_exists
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы