关于 compact ('user') 中使用'user'的疑问?
问题
请问各位:
- 教程里面的下段代码中,
edit()
方法传入的实例是$user
,而在调用compact()
处理时,用的是'user'
而不是$user
。对此,我查了下 PHP 的手册,手册的范例中用'var'
和$var
都可以传入参数(见最下方范例),但是把教程中的'user'
换成$user
却无法得到 相同的结果。
且经过试验,在return view('users.edit', compact('something'));
这行代码里面,必须用'something'
来传入参数,而不能用$something
,这是否由于处于view()
里面呢,有没有相关的解释或原理资料? compact()
函数应该返回一个array
对象,但在view中用{{var_dump($user)}}
查看$user
变量的详情时,显示的类型是object(App\Models\User)
,这是 Laravel 框架特有的性质吗?应该怎样理解呢?谢谢分享和解答。
<?php
namespace App\Http\Controllers;
.
.
.
class UsersController extends Controller
{
.
.
.
public function edit(User $user)
{
return view('users.edit', compact('user'));
}
}
PHP 手册的范例 ¶
Example #1 compact() 例子
<?php
$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";
$location_vars = array("city", "state");
$result = compact("event", "nothing_here", $location_vars);
print_r($result);
?>
以上例程会输出:
Array
(
[event] => SIGGRAPH
[city] => San Francisco
[state] => CA
)
1.为什么
user
可以,而$user
不可以?先看下PHP官方对于这个函数的解释。
意思就是,PHP会根据传入的参数,去从当前的符号表,也就是
compact
所执行的作用域去寻找有没有相应名称的变量,所以edit()
方法传入的是$user
,但是$user
并不是$user
这个变量的名称,user
才是,$
是PHP对变量的一种标识吧,看下PHP对变量的解释。所以
user
才是变量名,而不是$user
。所以你传入$user
,自然就找不到名为$user
的变量。2.为什么
user
变量的类型是object(App\Models\User)
,而不是array
?因为
view()
函数的第二个参数就是你要传进视图的数据。这个参数是一个数组,也就是这个数组里的数据都是要传入视图的。如下对比代码所示:等于
所以你在视图里访问
user
变量的时候,实际访问的就是这个数组里user
键所对应的内容,也就是edit
函数传进来的user
参数,这个user
参数就是框架自动注入进来的User
模型的实例,所以这个变量的类型显然就是object(App\Models\User)