有人能解释PHP的compact()函数接受“具有该名称的变量”字符串而不是实际变量的好处吗?
例如:
$foo = 'foo';
$bar = 'bar';
$compacted = compact('foo', 'bar');
为什么我需要传递变量名的字符串而不是仅传递变量本身和PHP处理将其映射到数组?像这样:
$compacted = compact($foo, $bar);
答案 0 :(得分:35)
就好处而言,我发现compact()在MVC应用程序中很有用。如果您正在编写控制器代码,并且需要将您在控制器中设置的变量及其明显名称的关联数组传递给视图,则会缩短以下内容:
View::make('home')->with(array('products' => $products, 'title' => $title, 'filter' => $filter'));
到
View::make('home')->with(compact('products', 'title', 'filter'));
答案 1 :(得分:22)
因为compact()
函数需要知道变量的名称,因为它将把它们用作数组键。如果直接传递变量,则compact()
将不知道它们的名称,并且没有任何值可用于返回的数组键。
但是,我建议手动构建阵列:
$arr = array(
'foo' => $foo,
'bar' => $bar);
我认为compact()
已被弃用,并且会避免在任何新代码中使用它。
答案 2 :(得分:8)
compact
是一个函数而不是语言构造。 PHP函数无法知道传递给它们的变量的名称。从理论上讲,compact
可以作为unset
或isset
等语言构造实现,并按照您描述的方式工作。但事情并非如此。
答案 3 :(得分:0)
我了解哪些作者不需要此答案,对于宾客来说,此答案。 对我来说,当我在类中定义变量以进行查看时,可以使用此功能 而是像这样发送每个变量
$with = ['user' => $user, 'portfolio' = > $portfolio]
。$with = compact(array_keys(get_defined_vars())); View::make('home')->with($with);
,并且所有定义的变量都在视图中。我觉得很舒服。
通知在有高负荷项目时不要使用compact
,因为该函数会产生开销*