在php上的compact()vs手动数组声明

时间:2016-02-23 21:59:16

标签: php arrays

我通常使用php的compact()函数从变量构建数组。另外,我可以手动创建该数组。这些用法有任何优点或缺点吗?我将在以下部分中分享这两个声明的示例:

紧凑型使用

   <?php 
    $name = "John";
    $surname = "Doe";
    compact('name','surname');
?>

输出:

['name'=>'John','surname'=>'Doe']

手动数组声明

<?php 
$name = "John";
$surname = "Doe";
$data = array("name"=>$name,"surname"=>$surname);
?>

输出:

['name'=>'John','surname'=>'Doe']

2 个答案:

答案 0 :(得分:16)

2021 静态分析答案

compact() 曾经是打印变量数组的便捷快捷方式。 然而如今,当我们在 PHP 中拥有 PHPStan、Rector、IDE 和严格类型时,使用 Compact 为静态分析和 IDE 自动完成带来了巨大的障碍。

使用显式变量 (2.) 使您的 IDE 和其他工具能够了解类型,并帮助您进行代码自动完成、静态分析和自动重构。


1.使用 compact()

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

$items = getValues();

IDE/PHPStan/Rector 是怎么看的?

  • 这是一个函数
  • 有 2 个字符串
  • getValues() 的返回类型是 mixed[]
  • 有 2 个未使用的变量 - $name$surname
foreach ($items as $item)
{
    $item->? // it's mixed
}

2.使用显式变量

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

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

$items = getValues();

IDE/PHPStan/Rector 是怎么看的?

  • 这是一个数组
  • 有 2 个项目
  • getValues() 的返回类型是 array<string, string>
foreach ($items as $item)
{
    $item->? // it's a string
}

自己比较 PHPStan 结果


enter image description here

答案 1 :(得分:14)

我认为这更属于偏好。

用途

如果我声明了一堆局部变量,并且我碰巧希望我的数组键以相同的方式命名,compact非常有帮助。

我不经常发现这种情况。通常我会定义一个更复杂的数组:

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

要在此使用compact,您必须首先定义变量$foo $bar$baz,这似乎很愚蠢。

我喜欢compact,我发现大多数时候我都没有发现它有用。

效果

好的我必须去做。这是一个非常基本的非科学性能比较:

https://3v4l.org/WTrOJ

简而言之,使用compact的速度要慢一个数量级。

然而,你必须使用它100,000(在这个例子中)只需要很短的一秒钟。

换句话说:使用对您的代码最有意义的东西。不要担心性能差异极小!