1

我知道 __isset() 用于不存在的属性。但我希望它在一个为空的存在属性上。默认情况下它可能很好:

class myClass
{
 public function __isset($name)
 {
  // create an object;
 }
}

$a = new myClass();
$a->mails->get();
$a->users->login();

但是邮件,用户对象不在声明中。所以这可能是解决方案,但它会导致类失真,在 UML 图上反映不好等。真正的解决方案可能是:

class myClass
{
 public $users = null;
 public $mails = null;
 public function __isset($name)
 {
  // create an object BUT IT WONT TRIGGER!
 }
}

$a = new myClass();
$a->mails->get();  // <- fail!
$a->users->login();

仅仅因为用户,邮件被声明。但它现在反映了良好的结构!Singleton 可能已经很好了,但我不想要它。当访问的东西为空时,有没有办法触发某些东西?

4

3 回答 3

1

我建议不要破坏封装并使用 getter 和 setter 而不是直接字段寻址。此外,它将按定义解决您的问题。

于 2011-12-05T13:28:20.073 回答
1

[编辑]

如果可以制作这些属性,那么您可以private通过以下方式访问它们:function

public function get_Property($property_name) {
    if (!isset($this->{$property_name})) {
        echo "\n Property : '$property_name' cannot be accessed because it is not set or is null \n";
        // or create your object here then return it;
    else {
        return $this->{$property_name};
    }
}
于 2011-12-05T13:28:23.867 回答
1

嗯,也许说明了显而易见的原因并撇开目前您的实施无法正常工作的各种原因,您为什么不这样做:

public function getMails()
{
    if (!$this->mails) {
        $this->mails = new ... whatever ...;
    }

    return $this->mails;
}

如果您需要一些服务来获取邮件,请将其注入构造函数中:

private $mailService;

public function __construct($mailService)
{
    $this->mailService = $mailService;
}

public function getMails()
{
    if (!$this->mails) {
        $this->mails = $this->mailService->magicallyFetchMails();
    }

    return $this->mails;
}

不确定为什么要公开对象属性。

于 2011-12-05T13:30:12.757 回答