PHP类扩展了Singleton并访问了它的属性

时间:2017-02-24 20:36:17

标签: php singleton

我的孩子班的单身课程:

class Api
{
    protected static $instance = null;

    protected $baseUrl = 'http://google.com';
    protected $clientId;
    protected $clientSecret;

    public static function getInstance(string $clientId, string $clientSecret)
    {
        if (self::$instance === null) {
            self::$instance = new self($clientId, $clientSecret);
        }

        return self::$instance;
    }

    protected function __construct(string $clientId, string $clientSecret)
    {
        $this->clientId     = $clientId;
        $this->clientSecret = $clientSecret;
    }

    public function setBaseUrl(string $baseUrl)
    {
        $this->baseUrl = $baseUrl;
    }

    public function user()
    {
        return new User();
    }
}

class User extends Api
{
    public function me()
    {
        var_dump($this->baseUrl); // HERE
    }
}

我想用它如下:

$api = Api::getInstance('abc', 'def');

$api->setBaseUrl('http://google.dev');

$api->user()->me();

此脚本如何在me()内调用值http://google.dev User

另外,如何设置User来处理API构造函数参数?

也许我会尝试使用我的示例中没有很好实现的现有模式?

1 个答案:

答案 0 :(得分:0)

所以问题在于,当你调用user()时,它会创建一个全新的User类实例...所以它不知道你创建的Api实例的属性,并且你在其上调用{ {1}}。

这取决于你的要求,这里。

如果您希望Api-> user()每次都返回一个新用户,那么您可以使用Api url属性的当前值初始化它...但是如果您再调用再次在Api实例上设置setBaseUrl,之前创建的任何用户仍将具有旧值。

如果您希望该类的所有实例共享该网址,那么您可以将该属性设为静态...但请记住,如果您这样做,则可以调用$ user-> setBaseUrl(...)并更改所有用户的网址 Api实例...

<强>更新

首先,我不认为我会将您的User类作为API的子类...

听起来像你的API是一回事 - 为远程API提供服务 - 而你的用户是一个与API分开的实际对象。

由于您的API是单身,因此您的用户实例可以完全调用它来处理它的内容:

setBaseUrl()

或者直接调用一些API方法:

API::getInstance()->getBaseUrl();

可以返回一个原始API对象,用户可以解析或使用它来填充它自己的属性......

这有助于澄清一些事情吗?