为什么PHP compact()使用字符串而不是实际变量?

nat*_*per 25 php

任何人都可以解释PHP的compact()函数接受"具有该名称的变量"而不是实际变量的字符串的好处吗?

例如:

$foo = 'foo';
$bar = 'bar';

$compacted = compact('foo', 'bar');
Run Code Online (Sandbox Code Playgroud)

为什么我需要传递一个变量名字符串而不是只传递变量本身和PHP处理映射到一个数组?像这样:

$compacted = compact($foo, $bar);
Run Code Online (Sandbox Code Playgroud)

And*_*rew 36

至于好处,我发现compact()在MVC应用程序中很有用.如果您正在编写控制器代码,并且需要将您在控制器中设置的变量及其明显名称的关联数组传递给视图,则会缩短以下内容:

View::make('home')->with(array('products' => $products, 'title' => $title, 'filter' => $filter'));
Run Code Online (Sandbox Code Playgroud)

至

View::make('home')->with(compact('products', 'title', 'filter'));
Run Code Online (Sandbox Code Playgroud)

  • 缺点是IDE不会知道您正在使用这些变量.所以你最终会得到关于未使用的变量和更复杂的自动重构的警告. (9认同)
  • @Mediascreen PhpStorm IDE识别`compact`方法中的变量 (9认同)
  • @Mediascreen:我在我的IDE(vim)中使用phpmd,它似乎是紧凑的.请参阅https://github.com/manuelpichler/phpmd/blob/e8c3f53e7f419b68684352db1a4a4ffc5464a07e/src/test/php/PHPMD/Rule/UnusedLocalVariableTest.php#L497 (2认同)

cdh*_*wie 24

因为compact()函数需要知道变量的名称,因为它将把它们用作数组键.如果直接传递变量compact(),则不知道它们的名称,并且没有任何值可用于返回的数组键.

但是,我建议手动构建数组:

$arr = array(
    'foo' => $foo,
    'bar' => $bar);
Run Code Online (Sandbox Code Playgroud)

我认为compact()已弃用,并且会避免在任何新代码中使用它.

  • 您从哪里看到/认为不推荐使用compact()? (13认同)
  • @SazzadHossainKhan没有记录被弃用,而是我认为它被弃用 - 我不会在任何新代码中使用它,我会拒绝使用它的任何代码审查.通过字符串值引用当前词法范围中的变量是IMO非常危险且容易出错.还有其他选择比`compact()`更灵活,也更不危险. (7认同)
  • @Unnawut建议手动构建数组.像`compact()`这样的函数让其他人(或者你自己的未来版本)难以阅读你的代码,因为它不会立即明显发生了什么. (3认同)
  • FWIW,compact()在Laravel 5中大量使用,并且在PHP上等效于相对较近的ES6解构对象分配;因此,如今看来,它所代表的模式颇为流行。 (3认同)
  • @cdhowie 到目前为止,它对我收集输出数据很有用,例如 compact() 多个变量,然后 json_encode() 将其转换为一个响应。在这种情况下,您会推荐“其他选择”吗? (2认同)

cle*_*ong 11

compact是一种功能而不是语言结构.PHP函数无法知道传递给它们的变量的名称.从理论上讲,compact可以作为一种语言结构实现,unset或者像isset你描述的那样工作.但事实并非如此.

  • 这是问题的实际答案。如果 compact 是一种语言结构,那么它可以工作,类似于 ES6 如何将这个 `{name: name, lastName: lastName}` 简化为这个:`{name, lastName}` (3认同)