compact() vs manual array declaration on PHP

I think it's more a matter of preference.

Uses

If I have a bunch of local variables declared, and I happen to want my array keys to be named the same way, compact is very helpful.

I don't find that to be the case very often though. Typically I'm defining an array that is more complex:

$array = [
    'foo' => $something->foo(),
    'bar' => $bar,
    'baz' => A_CONSTANT
];

To use compact here you'd have to define your variables $foo $bar and $baz first, which seems silly.

I like compact, I just don't find it to be all around helpful most of the time.

Performance

Ok I had to go do it. Here's a very basic non-scientific performance comparison:

https://3v4l.org/WTrOJ

In short, using compact is an order of magnitude slower.

And yet, you have to use it 100,000 (in this example) to matter a tiny fraction of a second.

In other words: use what makes the most sense for your code. Don't worry about the incredibly small performance difference!


2021 Static Analysis Answer

The compact() used to be a handy shortcut for printing array of variables. Yet nowadays, when we have PHPStan, Rector, IDE and strict types in PHP, using compact brings a huge obstacle for static analysis and IDE autocomplete.

Using explicit variables (2.) empowers your IDE and other tool to know the types and helps you with code autocompletion, static analysis and automated refactoring.


1. Using compact()

function getValues(...) {
    $name = 'Elon';
    $surname = 'Musk';
    return compact('name','surname');
}

$items = getValues();

How does IDE/PHPStan/Rector see it?

  • it's a function
  • there are 2 strings
  • return type of getValues() is mixed[]
  • there are 2 unused variables - $name and $surname
foreach ($items as $item)
{
    $item->? // it's mixed
}

2. Using Explicit variables

function getValues(...) {
    $name = 'Elon';
    $surname = 'Musk';

    return [
        'name' => $name,
        'surname' => $surname,
    ]);
}

$items = getValues();

How does IDE/PHPStan/Rector see it?

  • it's an array
  • there are 2 items
  • return type of getValues() is array<string, string>
foreach ($items as $item)
{
    $item->? // it's a string
}

Compare PHPStan results Yourself

  • explicit: https://phpstan.org/r/48f4ce8b-c964-4a06-b03f-c182fb2d487f
  • compact: https://phpstan.org/r/8023498a-b4fc-40e0-9086-36adafa1b2e3

enter image description here

Tags:

Php

Arrays