Php在其null时创建一个被访问的对象(如__isset())

时间:2011-12-05 13:20:39

标签: php class properties isset

我知道__isset()用于非存在属性。但我希望它在一个null属性的存在属性上。 默认情况下,这可能是好的:

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();

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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};
    }
}

答案 2 :(得分: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;
}

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