使用并不总是存在的PHP类

时间:2012-10-13 01:13:58

标签: php class

我对面向对象的编程很新,所以如果我错过了一些简单的事情,或者做错了什么,请耐心等待。

我有一个设置,其中域类可以包含域名的详细信息(例如名称,到期日,创建日期等),但也可以有一个$ 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()是否存在以防止出现此错误?

非常感谢,如果这是一个简单的错误,对不起!

6 个答案:

答案 0 :(得分:2)

实际上你没有一种,只有两种:

class Domain {
   ....
}

class HostedDomain extends Domain {
   ...
}

相应地编写代码。 HostedDomainDomain更具体一点。它可用于Domain适合的任何地方以及一些额外的特殊位置。

然后,您可以检查每个域是否已托管;

if ($domain instanceof HostedDomain) {
    ...
}

请参阅Object inheritanceType operators

答案 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方法,当然(其他一些答案解决的问题)。