compact() vs manual array declaration on PHP2021年静态分析答案

2022-08-30 22:55:15

我通常使用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']

答案 1

2021年静态分析答案

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

使用显式变量 (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


答案 2

我认为这更多的是一个偏好问题。

使用

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

不过,我不认为这种情况经常发生。通常,我定义一个更复杂的数组:

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

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

我喜欢,我只是觉得它在大多数时候都没有帮助。compact

性能

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

https://3v4l.org/WTrOJ

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

然而,你必须用它100,000(在这个例子中)来影响一秒钟。

换句话说:使用对代码最有意义的东西。不要担心令人难以置信的小性能差异!