2011-12-05 28 views
1

我知道__isset()是为一个不存在的属性。但是我想要一个存在的属性为null。 默认情况下,它可能是好的:PHP创建一个访问的对象时,它的空(如__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(); 

只是因为用户,邮件声明。但它现在反映了良好的结构!辛格尔顿可能已经很好,但我不想要它。当访问的内容为空时,是否有办法触发某些内容?

回答

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}; 
    } 
} 
+0

ok,但CheckCredentials()在访问一个null属性时不会触发 –

+1

我修改了我的帖子,看看是否可以接受.. – Nonym

1

我想推荐不要打破封装,并使用getters和setters而不是直接字段寻址。此外,它会根据定义解决您的问题。

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; 
} 

不知道为什么你想暴露你的对象属性。

相关问题