关于 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
)


关于 LearnKu
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)