我在 laravel 的 Authenticatable
trait 中遇到过:
public function setRememberToken($value)
{
if (! empty($this->getRememberTokenName())) {
$this->{$this->getRememberTokenName()} = $value; //here
}
}
public function getRememberTokenName()
{
return $this->rememberTokenName;
}
我知道第一个 $this
会指出使用 trait 的类(模型)。但是,
{$this}
是什么意思? public function setRememberToken($value)
{
if (! empty($this->getRememberTokenName())) {
$this->rememberTokenName = $value;
}
}
答案 0 :(得分:4)
这是complex curly syntax。
基本上,如果 $this->getRememberTokenName()
返回字符串值 six
那么表达式本质上是 $this->six
答案 1 :(得分:2)
特征使用从 getRememberTokenName()
返回的值,它实际上只是 $this->rememberTokenName
的值,作为模型类中应该保存该值的属性的名称。例如,如果 $this->rememberTokenName
设置为 'myToken',则 setRememberTokenFunction
的作用相当于
$this->myToken = $value;
这只是一种让模型类配置保存令牌值的变量名称的复杂方法。
<?php
trait Authenticatable
{
public function setRememberToken($value)
{
// If there is a token name...
if (!empty($this->getRememberTokenName()))
{
/*
* Set the property with the token name to the provided value
* Example: if $this->getRememberTokenName() returns 'myToken',
* this is equivalent to $this->myToken = $value
*/
$this->{$this->getRememberTokenName()} = $value;
}
}
public function getRememberTokenName()
{
return $this->rememberTokenName;
}
}
class Model
{
use Authenticatable;
private $myToken;
private $rememberTokenName = 'myToken';
public function __construct($myToken)
{
$this->myToken = $myToken;
}
public function getMyToken()
{
return $this->myToken;
}
}
$myModel = new Model('foo');
assert($myModel->getMyToken() == 'foo', 'Token should match constructor argument');
$myModel->setRememberToken('bar');
$updatedToken = $myModel->getMyToken();
assert($updatedToken == 'bar', 'Token should have been updated by trait');