我对面向对象的编程很新,所以如果我错过了一些简单的事情,或者做错了什么,请耐心等待。
我有一个设置,其中域类可以包含域名的详细信息(例如名称,到期日,创建日期等),但也可以有一个$ hosting变量,该变量与域名的托管帐户相关并列。但是,并非所有域都是托管的,只是等待使用,因此托管对象并不总是存在。
在两个域和托管中,我都有返回相关详细信息的功能,例如:
private $accountId;
private $name;
private $created;
public function getAccountId() { return $this->accountId; }
public function getName() { return $this->name; }
public function getCreated() { return $this->created; }
所以,如果我想从域对象(称为$ domain)中托管帐户ID,我可以这样做:
$domain->getHosting()->getId();
跳起来有意义!
如果有托管帐户,则返回ID:
PHP Fatal error: Call to a member function getAccountId() on a non-object in /home/sites/.../file.php on line x
有没有办法检查$domain->getHosting()
是否存在以防止出现此错误?
非常感谢,如果这是一个简单的错误,对不起!
答案 0 :(得分:2)
实际上你没有一种,只有两种:
class Domain {
....
}
class HostedDomain extends Domain {
...
}
相应地编写代码。 HostedDomain
比Domain
更具体一点。它可用于Domain
适合的任何地方以及一些额外的特殊位置。
然后,您可以检查每个域是否已托管;
if ($domain instanceof HostedDomain) {
...
}
答案 1 :(得分:1)
您可以使用PHP method_exists
if(method_exists($domain,'getHosting')){ ... }
答案 2 :(得分:1)
或者,如果你真的想检查这个类是否存在:
if (class_exists('Domain')) { ... }
答案 3 :(得分:1)
我的PHP不仅有点生疏,但我相信域对象中的isset($hosting)
会有所帮助,或者作为域类中的方法(例如hasHost)来检查主机是否存在,或者只是{ {1}}。假设你没有设置$ hosting如果没有主机,isset应该做你想要的。
答案 4 :(得分:0)
在使用之前检查getHosting是否存在
if (! $domain->getHosting()) {
$value = $domain->getHosting()->getId();
}
答案 5 :(得分:0)
由于你的方法getHosting()
返回一个对象,你应该将值存储到一个临时变量中,检查变量是否为空,如果它不为空,你可以使用它:
$hosting = $domain->getHosting();
if (!empty($hosting)) {
$id = $hosting->getId();
}
除了empty()
之外,您还有一些选择。您还可以使用isset()
,is_object()
或检查是否$hosting != null
- 所有这些都应该为您提供此方案中所需的逻辑。
这一切都假定getHosting()
类中存在Domain
方法,当然(其他一些答案解决的问题)。