关于使用set()和compact()的CakePHP澄清.只能使用compact()

Old*_*est 15 model-view-controller cakephp view set

我知道compact()是一个标准的PHP函数.而set()是一种特定于蛋糕的方法.

我运行一个值传递给使用Ajax生成的视图(用户呈现()在我的控制器)的一个简单的测试,和,如果我的设置是这样,因此仅通过从控制器到该视图的值:

$variable_name_to_pass = "Passing to the view using set() can compact()";

$this->set(compact('variable_name_to_pass'));
Run Code Online (Sandbox Code Playgroud)

从阅读手册,看​​来set()应该与w/out compact一起工作.

任何人都可以解释为什么set()不会单独工作?喜欢

$this->set('variable_name_to_pass');
Run Code Online (Sandbox Code Playgroud)

小智 43

根据CakePHP API:

参数:

$one需要混合

字符串或数据数组.

混合$two 可选 NULL

case $one中的值是一个字符串(然后作为键).未使用if $one关联数组,否则用作$one键的值.

compact函数返回一个关联数组,通过获取输入数组中指定的名称,将它们用作键,并获取这些名称引用的变量的值并使其成为值来构建.例如:

$fred = 'Fred Flinstone';
$barney = 'Barney Rubble';
$names = compact('fred', 'barney');

// $names == array('fred' => 'Fred Flinstone', 'barney' => 'Barney Rubble')
Run Code Online (Sandbox Code Playgroud)

因此,当您compact与函数一起使用时set,您将使用set函数的单个参数形式,通过传递一个键值对的关联数组.

如果您只想在视图上设置一个变量,并且想要使用单个参数表单,则必须set以相同的方式调用:

$variable_to_pass = 'Fred';
$this->set(compact('variable_to_pass'));
Run Code Online (Sandbox Code Playgroud)

否则,set可以使用两个参数形式:

$variable_to_pass = 'Fred';
$this->set('variable_to_pass', $variable_to_pass);
Run Code Online (Sandbox Code Playgroud)

两者都达到了同样的目的.