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

bl4*_*sta 6 php arrays

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

紧凑的用法

   <?php 
    $name = "John";
    $surname = "Doe";
    compact('name','surname');
?>
Run Code Online (Sandbox Code Playgroud)

输出:

['name'=>'John','surname'=>'Doe']
Run Code Online (Sandbox Code Playgroud)

手动阵列声明

<?php 
$name = "John";
$surname = "Doe";
$data = array("name"=>$name,"surname"=>$surname);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

['name'=>'John','surname'=>'Doe']
Run Code Online (Sandbox Code Playgroud)

Tom*_*uba 19

2021 静态分析答案

compact()过去被用于打印的变量阵列的方便快捷方式。然而如今,当我们在 PHP 中拥有 PHPStan、Rector、IDE 和严格类型时,使用 compact 给静态分析和 IDE 自动完成带来了巨大的障碍。

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


1. 使用 compact()

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

$items = getValues();
Run Code Online (Sandbox Code Playgroud)

IDE/PHPStan/Rector 是怎么看的?

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

2. 使用显式变量

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

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

$items = getValues();
Run Code Online (Sandbox Code Playgroud)

IDE/PHPStan/Rector 是怎么看的?

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

自己比较 PHPStan 结果


在此处输入图片说明


jsz*_*ody 14

我认为这更多的是偏好问题.

用途

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

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

$array = [
    'foo' => $something->foo(),
    'bar' => $bar,
    'baz' => A_CONSTANT
];
Run Code Online (Sandbox Code Playgroud)

要使用compact这里你必须确定你的变量$foo $bar$baz第一,这似乎是愚蠢的.

我喜欢compact,我只是觉得大部分时间都没有帮助.

性能

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

https://3v4l.org/WTrOJ

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

然而,你必须使用它100,000(在这个例子中)只需要一小部分时间.

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

  • 我同意“我只是觉得它在大多数情况下都没有帮助。”。我还可以补充一点,我从未见过以任何有用的方式使用 compact,我见过它被滥用来做一些错误的事情(比如压缩变量,所以它们被用作参数传递,只是为了在另一个函数中扩展)。 (2认同)
  • 如果您使用 `compact`,您的代码是不是更易读和更不明确,如果您使用 `compact` 而不是数组中的定义,您的 IDE 如何计算变量类型? (2认同)