Я хочу преобразовать аргументы в функцию в ассоциативный массив с ключами, равными именам переменных параметров, и значениями, равными значениям параметров.
PHP:
function my_function($a, $b, $c) { // <--- magic goes here to create the $params array var_dump($params['a'] === $a); // Should result in bool(true) var_dump($params['b'] === $b); // Should result in bool(true) var_dump($params['c'] === $c); // Should result in bool(true) }
Как я могу это сделать?
Вы можете сделать это с помощью compact
:
function myFunc($a, $b, $c) { $params = compact('a', 'b', 'c'); // ... }
Или get_defined_vars()
предоставит вам ассоциативный массив из всех переменных, определенных в этой области, что будет работать, но я думаю, что это может также включать $_POST
, $_GET
и т. Д. …
В противном случае вы можете использовать func_get_args
чтобы получить список всех аргументов, переданных функции. Однако это не ассоциативно, поскольку передаются только данные (т. Е. Нет имен переменных). Это также позволяет вам иметь любое количество аргументов в вашей функции.
Или просто укажите один аргумент, который представляет собой массив:
function myFunc($params) { }
compact()
кажется, ближе всего к тому, что вам нужно.
get_defined_vars () – это то, что вам нужно, если никакие другие vars не определены перед его вызовом внутри функции (вы можете обеспечить это, сделав это первым, что вы делаете внутри функции).
function my_function($a, $b, $c) { $params = get_defined_vars(); // <--- create the $params array var_dump($params['a'] === $a); // results in bool(true) var_dump($params['b'] === $b); // results in bool(true) var_dump($params['c'] === $c); // results in bool(true) }
Я поддержал ответ @ nickf, но хотел бы добавить, что compact () также отличный способ создать экземпляр модели с помощью ctor:
class User { public $email; public $password; public $firstName; public $lastName; public function __construct ( $email, $password, $firstName, $lastName ) { foreach ( compact( array_keys( (array)$this )) as $k => $v ) $this->$k = $v; } }
Просто убедитесь, что параметры имеют то же самое правописание, что и поля.