我的孩子班的单身课程:
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
构造函数参数?
也许我会尝试使用我的示例中没有很好实现的现有模式?
答案 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对象,用户可以解析或使用它来填充它自己的属性......
这有助于澄清一些事情吗?