Здравствуйте!
В коде движка WordPress часто используется такая конструкция:
1 2 3 |
extract($args, EXTR_SKIP); |
В данной статье я объясню для чего используется этот код.
Впервые я встретил этот код, когда изучал пользовательский вывод комментариев в WordPress. Оказывается, что функция extract не имеет отношения именно к WordPress, а является родной функцией языка php ( на котором написан код CMS WordPress). И не смотря на то, что я уже несколько лет пишу код на языке программирования php, функцию extract мне не доводилось использовать в своей работе. Тем не менее, разобравшись с её предназначением – нашел функцию extract очень удобной для применения в некоторых случаях. Так что, друзья, смотреть и изучать чужой код полезно для развития и повышения своего профессионального уровня в области программирования. Особенно для фрилансеров, которые работают самостоятельно и не имеют возможности регулярно обмениваться опытом со своими коллегами, в отличие от сотрудников, которые работают в офисах.
Теперь в ближе к теме. Немного справочной информации.
Функция extract
extract – создает переменные из элементов массива
Синтаксис
1 2 3 4 |
int extract ( array &$var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix = NULL ]]) |
Параметры:
var_array – ассоциативный массив. Ключи массива будут именами переменных, а их значения соответственно – значениями переменных.
extract_type – способ трактования коллизий
EXTR_OVERWRITE – если одноименная переменная уже существует, то она будет перезаписана;
EXTR_SKIP – если одноименная переменная уже существует, то ее текущее значение не будет перезаписано.
EXTR_PREFIX_ALL – добавить префикс prefix ко всем именам переменных;
EXTR_PREFIX_SAME – если одноименная переменная уже существует, то к её имени будет добавлен префикс prefix, определенный в третьем параметре функции;
EXTR_PREFIX_INVALID – добавить префикс prefix только к некорректным/числовым именам переменных.
EXTR_IF_EXISTS – перезаписать только переменные, которые уже существуют. Эта возможность полезна, например, для извлечения из массива типа $_REQUEST значений только тех переменных, которые у вас уже определены.
EXTR_PREFIX_IF_EXISTS – создать только переменные с префиксами, в случае, если версия данной переменной без префикса уже существует.
EXTR_REFS – Извлечь переменные как ссылки. Это означает, что значения таких переменных будут ссылаться на значения массива var_array.
По умолчанию параметр extract_type имеет значение EXTR_OVERWRITE.
prefix – этот параметр имеет значение, только если предыдущий параметр extract_type установлен в EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID или EXTR_PREFIX_IF_EXISTS.
Теперь, основываясь на вышеизложенной информации, мы может понять, что выполняет данный код: extract($args, EXTR_SKIP);
Например, пусть массив $args содержит следующие ключи и значения:
1 2 3 4 |
$args = array('max_depth' => '5', 'avatar_size' => '32'); |
Такие параметры передаются в функцию wp_list_comments, код которой описан в файле /wp-includes/comment-template.php.
Реальный массив имеет большее число элементов, но я взял только два ключа для простоты примера.
Теперь после выполнения extract($args, EXTR_SKIP); у нас будут созданы две переменные:
$max_depth и $avatar_size и им будут присвоены значения ‘5’ и ‘32’ соответственно. То есть, данный вызов функции extract эквивалентен коду (но не всегда! – читайте далее):
1 2 3 4 5 |
$max_depth = $args['max_depth']; $avatar_size = $args['avatar_size']; |
Может возникнуть вопрос, зачем нам использовать функцию extract, если можно просто создать нужные переменные и присвоить им соответствующие значения из массива; или, вообще, не плодить промежуточные переменные, а получать нужные значения непосредственно из массива (например вот так: $args[‘avatar_size’])?
Удобство функции extract заключается во втором параметре $extract_type. В нашем примере он имеет значение EXTR_SKIP, что означает – не изменять значение тех переменных, которые уже существовали до вызова функции extract.
То есть, в случае, если переменная $max_depth или $avatar_size уже существовала, то данный вызов функции extract не повлияет на значения этих переменных и для создания эквивалентного кода без использования функции extract, в таком случае, нам пришлось бы писать нечто подобное:
1 2 3 4 5 6 7 8 |
if (!isset($max_depth)) { $max_depth = $args['max_depth']; } if (!isset($avatar_size)) { $avatar_size = $args['avatar_size']; } |
И так далее, для всех других значений второго параметра функции extract нужно создавать индивидуальный код.
Вот, собственно, главное удобство функции extract – вы можете создать ряд переменных на основании данных массива, при этом не изобретая каждый раз “велосипед” для различных ситуаций (перезаписывать значения, не перезаписывать, создавать переменные с префиксом или без него и т.п.).
На сегодня – всё. Пока! Профессионального вам роста!
P.S. Кстати, это юбилейная 50-ая статья на моем блоге. До цели №1 осталось написать 20 статей. У меня есть еще более 60 дней на это. Так что, думаю, цель будет достигнута в срок. А вот то, что цель №2 будет достигнута к указанной дате, я уже стал сомневаться. По данным “Яндекс Вебмастер” на данный момент на меня ссылаются всего лишь 25 сайтов. Одна надежда, что апдейт тИЦ будет гораздо позже 1 марта.