extract и compact

В этом посте я расскажу о двух очень полезных функциях которыми я очень часто пользуюсь и о которых, наверное, мало кто знает или считает плохой практикой.

Для начала я скажу что управление областью видимости не является плохой вещью. По моему мнению, нету плохого и хорошего в программирование. Есть просто разные инструменты и техники для решение определенных задач.

Внимание: в параграфе выше я не утверждаю что нужно пользоватся только синглетонами, глобальными переменными и goto. Каждый решает для себя какую технику использовать и имеет право на мнение против/за разные практики.

Теперь перейдем к самому интересному, самим функциям extract и compact.

extract

extract функция распаковывает значение из ассоциативного массива в данную область видимости. Аналогичный код который делает тоже самое что и extract с одним аргументом в виде массива:

foreach ($assoc_array as $key => $value) {
    $$key = $value;
}

// vs.

extract($assos_array);

Данная функция полезна для следующих задач:

Пример использования:

index.php
<?php

/**
 * __ нужны для предотвращения перезаписи переменных
 * 
 * @param string $__view__
 * @param array $__data__
 */
function render ($__view__, $__data__) {
    extract($__data__);

    require($__view__);
}

$title = 'Привет мир!';
$text  = 'Длинный текст...';

render('theme/view.php', [
    'title' => $title,
    'text'  => $text
]);
theme/view.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?php echo $title ?></title>
    </head>

    <body>
        <h1>
            <?php echo $title ?> 
        </h1>

        <p>
            <?php echo $text ?>
        </p>
    </body>
</html>

Я уверен что есть еще применение этой функции, но только их пока что не знаю.

compact

compact функция является противоположностью функции extract. Данная функция запаковывает массив ключей или названия переменных, разделенные через запятые, в ассоциативный массив, где название переменной станет ключем, а значение значением в массиве.

Эта функция будет полезна в следующих случаях:

Предыдущий пример можно упростить (укоротить) за счет использования compact:

<?php

/**
 * __ нужны для предотвращения перезаписи переменных
 * 
 * @param string $__view__
 * @param array $__data__
 */
function render ($__view__, $__data__) {
    extract($__data__);

    require($__view__);
}

$title = 'Привет мир!';
$text  = 'Длинный текст...';

render('theme/view.php', compact('title', 'text'));

Эти функции очень полезны для работы с переменными в данной области видимости. Используйте их там где они нужны. В любом случае, пример был усложнен для того чтобы показать как работает extract и compact. Первый пример можно упростить до:

<?php

$title = 'Привет мир!';
$text  = 'Длинный текст...';

require 'theme/view.php';

Всем хорошего дня/вечера!

Поделится

Комментарии