PHP extract and compact Functions Explained
This article explains the purpose, functionality, and practical use
cases of the extract() and compact() functions
in PHP. While extract() imports variables from an
associative array into the active symbol table, compact()
does the exact opposite by creating an associative array from existing
variables. Understanding these two helper functions allows developers to
manage data payloads and pass variables between different parts of an
application, such as controllers and views, with minimal boilerplate
code.
The extract() Function
The primary purpose of extract() is to take an
associative array and import its keys as variables into the current
scope. The keys of the array become the variable names, and the values
of the array become the values of those variables.
Syntax and Basic Example
$user = [
'username' => 'johndoe',
'email' => 'john@example.com',
'role' => 'admin'
];
extract($user);
echo $username; // Outputs: johndoe
echo $email; // Outputs: john@example.comSecurity and Collision Handling
By default, extract() will overwrite existing variables
in the local scope if an array key matches an already defined variable
name. To prevent security vulnerabilities or accidental overwrites, the
function accepts optional flags.
The most common flags include: * EXTR_OVERWRITE:
Overwrites existing variables (default behavior). *
EXTR_SKIP: Does not overwrite existing variables. *
EXTR_PREFIX_SAME: Prefix the variable name if a collision
occurs.
$username = 'existing_user';
$user = ['username' => 'new_user'];
// Skip overwriting existing variables
extract($user, EXTR_SKIP);
echo $username; // Outputs: existing_userUsing extract() on untrusted user input (like
$_GET or $_POST data) without flags is highly
discouraged, as it can lead to security vulnerabilities by overwriting
critical application variables.
The compact() Function
The compact() function is the exact counterpart to
extract(). It takes a variable number of parameters, which
can be strings containing variable names or arrays of variable names,
and builds an associative array.
Syntax and Basic Example
To use compact(), you pass the names of the variables
(as strings, without the $ sign) that you want to bundle
into an array.
$title = 'Software Engineer';
$location = 'Remote';
$salary = 90000;
$jobDetails = compact('title', 'location', 'salary');
print_r($jobDetails);
/*
Outputs:
Array
(
[title] => Software Engineer
[location] => Remote
[salary] => 90000
)
*/If a string passed to compact() does not correspond to
an active variable, that specific key is simply ignored.
Common Use Cases in PHP Development
The most frequent use case for both functions is in Model-View-Controller (MVC) frameworks.
Passing Data to Views (using
compact): In controllers, developers often fetch several individual variables and usecompact()to package them into a single array payload to pass to a template rendering engine.$posts = Post::all(); $categories = Category::all(); return view('dashboard', compact('posts', 'categories'));Unpacking Data inside Templates (using
extract): Template engines or view classes receive the packaged data array and useextract()to turn the array elements back into individual variables, making the template files cleaner and easier to read.// Inside the view rendering engine public function render($template, $data) { extract($data); include($template); // Variables like $posts and $categories are now directly accessible }