php中`$this->{$this}`是什么意思?

时间:2021-06-20 02:50:44

标签: php laravel

我在 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;
        }
    }

2 个答案:

答案 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');
相关问题