compact()与PHP上的手动数组声明

compact()与PHP上的手动数组声明,php,arrays,Php,Arrays,我通常使用php的compact()函数从变量构建数组。此外,我还可以手动创建该数组。这些用法有什么优点或缺点吗?我在以下部分分享这两项声明的一个例子: 紧凑型用法 <?php $name = "John"; $surname = "Doe"; compact('name','surname'); ?> 手动数组声明 <?php $name = "John"; $surname = "Doe"; $data = array("name"=&

我通常使用php的
compact()
函数从变量构建数组。此外,我还可以手动创建该数组。这些用法有什么优点或缺点吗?我在以下部分分享这两项声明的一个例子:

紧凑型用法

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

手动数组声明

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

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

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

不过,我觉得这种情况并不常见。通常,我定义的数组更复杂:

$array = [
    'foo' => $something->foo(),
    'bar' => $bar,
    'baz' => A_CONSTANT
];
要在这里使用
compact
,您必须首先定义变量
$foo
$bar
$baz
,这似乎很愚蠢

我喜欢紧凑型,我只是觉得它在大多数情况下都没有帮助

演出 好的,我必须去做。下面是一个非常基本的非科学性能比较:

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

然而,你必须用100000(在这个例子中)来计算一秒钟中的一小部分

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

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

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


1.使用
compact()
函数getValues(…){ $name='Elon'; $姓氏='麝香'; 返回契约(‘名称’,‘姓氏’); } $items=getValues(); IDE/PHPStan/Rector是如何看待它的?
  • 这是一个函数
  • 有两个字符串
  • getValues()
    的返回类型是
    mixed[]
  • 有两个未使用的变量-
    $name
    $name
foreach($items作为$item)
{
$item->?//它是混合的
}
2.使用显式变量 函数getValues(…){ $name='Elon'; $姓氏='麝香'; 返回[ “name”=>$name, “姓氏”=>$姓氏, ]); } $items=getValues(); IDE/PHPStan/Rector是如何看待它的?
  • 这是一个数组
  • 有两项
  • getValues()
    的返回类型是
    array
foreach($items作为$item)
{
$item->?//它是一个字符串
}

自己比较PHPStan结果
  • 明确的:
  • 紧凑型:


但是,在性能方面可能会有一点不同bit@bl4cksta除非您经常这样做,否则性能差异应该可以忽略不计。这是否回答了您的问题?我同意“我只是觉得它在大多数情况下都没有帮助。”。我还可以补充一点,我从未见过compact以任何有用的方式使用,我见过它被滥用来做一些错误的事情(比如压缩变量,以便它们被用作参数传递,以便在另一个函数中展开)。如果使用
compact
,代码的可读性和显式性是否会降低,如果您使用
compact
而不是数组中的定义,您的IDE如何计算变量类型?您可以获取测试结果并制作一篇题为“此函数将对您的速度产生10-30倍的影响!”的点击诱饵文章,确保100K循环的速度仅为2ms而不是1ms。“100000…很小的一秒钟。”对于一个公共API,您的代码每秒服务一百万个请求,请尝试这样做。通常有一些缓存之类的。但是,我认为Tomáš的回答很好地说明了为什么在大多数情况下不应该使用compact。静态分析可以帮助您在不进行测试的情况下发现相当多的bug,而使用compact将导致误报,这充其量是令人恼火的。也就是说,没有什么能阻止静态分析工具在未来变得更加智能,在这种情况下,性能将是唯一的问题。坦白地说,我真的很喜欢javascript的方法我不使用PHPStan,但是你不想
var\u dump($values['unknown'))
对你咆哮吗?compact()是PHP,因为PHP4。我不认为这是对IDE或静态分析器的支持。同时,这也清楚地表明,语言特性正在跨越实用性的界限。
['name'=>'John','surname'=>'Doe']
$array = [
    'foo' => $something->foo(),
    'bar' => $bar,
    'baz' => A_CONSTANT
];