2011-12-05 2 views
1

__isset()は存在しないプロパティのためのものであると理解しています。しかし、私はそれがヌルである存在するプロパティ上で欲しいです。 デフォルトでは、それは良いことができますphpはnull(__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(); 

ユーザー、メールが宣言されているという理由だけで。しかし、今は良い構造を反映しています!シングルトンは既に良いかもしれないが、私はそれを望んでいない。アクセスしたものがnullのときにトリガーする方法はありますか?

答えて

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

オブジェクトのプロパティを公開する理由がわからない場合は、コンストラクタに挿入してください。

+0

okですが、nullのプロパティにアクセスするとCheckCredentials()がトリガーされません –

+1

私の投稿が変更されました。 – Nonym

1

私はカプセル化を破って直接フィールドアドレッシングの代わりにゲッターとセッターを使用しないことをお勧めします。また、定義によって問題を解決します。

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

オム、多分明白なことを述べると、様々な理由を脇に残して:それはprivateが、その後function経由でそれらにアクセスするプロパティを作成することが可能です場合

関連する問題