Я (думаю), я понимаю функцию php’s extract (). Тем не менее, я читал некоторый код и увидел что-то вроде этого:
extract(['a' => '', 'b' => '', 'c' => 1, 'd' => 0]);
Мои вопросы:
1: Это функционально отличается от:
$a = ''; $b = ''; $c = 1; $d = 0;
2: Каковы причины объявления / назначения переменных с использованием extract ()?
Это функционально отличается от …
Никакие обе строки кода не являются эквивалентными. extract
возвращает значения, в которых ключу присваивается имя переменной, а значением является то, чему равна эта переменная, что изображено в каждой строке кода, что делает их функционально эквивалентными.
Каковы причины объявления / назначения переменных с использованием extract ()?
Разумный вариант использования будет использовать extract
на функцию, которая возвращает массив значений с известными ключами. Это экономит ваше время при написании строки декларации для каждого сохраненного значения. Я говорю известные ключи, потому что хотя использование неизвестных ключей возможно через использование array_keys
а также variable variables
, делая это, вы начинаете входить в область сомнительных методов кодирования.
В документации extract
в нем говорится: «Не использовать extract () для ненадежных данных …», которые включают введенные пользователем данные, которые могли быть злонамеренно изменены. Хотя это означает использование extract
$ _POST не подходит для общедоступной версии, функционально нет ничего плохого в том, чтобы делать это для тестирования или личного проекта, где вы можете гарантировать, что значения $ _POST соответствуют ожидаемым.
Имейте в виду, что при использовании extract
и если ваша программа когда-либо потребуется поддерживать на более позднем этапе, понимая, что такое extract
Оператор возвращает или найти источник переменных, которые пришли из выписки, может быть сложно. extract
имеет свое применение в программах, но оно должно сопровождаться комментариями с описанием того, что он делает, чтобы сделать будущие ссылки более ясными.
Цель.
1. Может использоваться как версия list (). Но в случае extract () вам не нужно заботиться о порядке изменений.
Кроме того, переменные, которые были извлечены из массива, относятся к конкретной области видимости.
В случае использования с БД вы можете быть уверены, что переменная существует
function foo($db){
$hdl = $db->prepare("SELECT * FROM test.first");
$hdl->execute();
$resultArray = $hdl->fetch(PDO::FETCH_ASSOC);
extract($resultArray,EXTR_PREFIX_SAME, "wddx");
echo $id . "<br>";
echo $name . "<br>";
echo $email . "<br>";
}
2. передать переменную в представления, когда вы используете MVC
//View.php
class View {
function render($filename = null) {
if ($filename !== null) {
$this->filename = $filename;
}
unset($filename);
extract($this->variables);
ob_start();
$this->returned = include($this->dir . $this->filename);
return ob_get_clean();
}
}
//test.php
$view = new View;
$view->filename = 'test.phtml';
$view->dir = './';
$view->variables = array('test' => 'tset');
echo $view->render('test.phtml');
var_dump($view->returned);
//test.phtml
<?php echo $test; ?>