我知道__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();
仅仅因为用户,邮件被宣布。但它现在反映了良好的结构!单身人士可能已经很好了,但我不想要它。当访问的内容为空时,有没有办法触发某些东西?
答案 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;
}
不确定为什么要公开对象属性。