对象陷入无限循环

时间:2016-04-13 09:12:17

标签: php oop

我试图仅仅处理一个关于OOP的简单概念,但是因为我使用了类似的东西,它已经有一段时间了。

class UserAPI
{
    protected $Email;
    protected $APIKey;
    public function setEmail($e)
    {
        $this->Email = $e;
        return (new UserAPI)->setEmail($this->Email);
    }
    public function setKey($k)
    {
        $k = hash('SHA256',$k);
        $this->APIKey = $k;
        echo 'Key Wrote';
        return (new UserAPI)->setEmail($this->Email)->setKey($this->APIKey);
    }
    public function getVals(){ echo 'Vals wrote;'; return array('key' => $this->APIKey, 'email' => $this->Email); }
}

print_r((new UserAPI)->setEmail('Example')
        ->setKey('Password')
        ->getVals());

正如你可能会聚集的那样,(new UserAPI)->setEmail('...')将陷入无限循环 - 最终将setKey();我已经坚持了很多年,并且无法弄清楚如何返回新的Object继续使用。

任何帮助都是完美的。

1 个答案:

答案 0 :(得分:2)

在类中使用$this->来引用对象本身,并使用new UserAPI()创建一个新对象。

class UserAPI
{
    protected $Email;
    protected $APIKey;
    public function setEmail($e)
    {
        $this->Email = $e;
        return $this;
    }
    public function setKey($k)
    {
        $k = hash('SHA256',$k);
        $this->APIKey = $k;
        echo 'Key Wrote';
        return $this;
    }
    public function getVals(){ 
        echo 'Vals wrote;'; 
        return array('key' => $this->APIKey, 'email' => $this->Email); 
    }
}

// this...
$u = new UserAPI();       // create object
$u->setEmail('Example');  // set e-mail
$u->setKey('Password');   // set password
print_r($u->getVals());   // get values

// ...is equivalent to this...
$u = new UserAPI();           // create object
print_r(
    $u->setEmail('Example')   // set mail
    ->setKey('Password')      // set password
    ->getVals());             // get values
// ...but only where the class methods return the object
// (ie. not for getValues())

只需返回$this即可将该类传播到另一个派生调用。

但是,