2010-12-15 10 views
3

「非オブジェクト上のメンバ関数への呼び出し」が致命的にならないようにする方法を教えてください。 (私は非常に便利で読みやすい見つける。)::「非オブジェクト上のメンバ関数への呼び出し」の処理方法

<?php echo $object->getRelatedObject()->getProperty()->formatProperty() ?> 

しかし、これは各メソッドが正しいクラスのオブジェクトを返す場合にのみ機能します

フォックスの例では、私は頻繁に私のテンプレートでは、このようなものを持っています。しかし、必ずしもそうではありません。関連オブジェクトはデータベースに存在しない可能性があるため、nullを返し、致命的なエラーに直面します。次に、戻り値を手動でチェックします。

<?php if (is_object($object->getRelatedObject()) && is_object($object->getRelatedObject()->getProperty())): 
    <?php echo $object->getRelatedObject()->getPreperty()->formatProperty() ?> 
<?php endif; ?> 

これはもう読めません。どのようにこの問題に取り組んでいますか?

答えて

5

Pオブジェクトまたはクラス。

例:

method_exists($object->getRelatedObject(), 'getProperty'); 

あなたはまた、彼らは必要なメソッドを持っていることを確認するために戻っrelatedObjectsおよび/またはプロパティオブジェクトにインターフェースを追加することができます。通話が通常NULLを返す場合は、このメソッドを持つNullObjectに変更します。

$objectから完全にformatPropertyにチェーニングすることをお勧めします。 $objectには、コールグラフの詳しい知識が必要です。あなたは関連オブジェクトからhiding the delegateを考えて、に移動して、一度に取得してフォーマットするか、フォーマットフラグでプロパティを取得できるようにしてください。

2

各メソッドは、返すオブジェクトを持たない環境で常に例外をスローできます。その後、

+1

おそらく、get * Object()のような名前が返されるオブジェクトがなければ、例外をスローするべきです(SHOULD)。 – Craige

+0

テンプレートのtry/catchブロックを越えたときにWebデザイナーの顔を見るのが大好きです。 – Dziamid

1
<?php 
$relatedObject = $object->getRealtedObject(); 
if(is_object($relatedObject)){ 
    $property = $relatedObject->getProperty(); 
    if(is_object(property)){ 
    .... 
    } 
} 
0
<?php 
$result="record not found"; 
if(is_object($object->getRelatedObject()) && 
    is_object($object->getRelatedObject()->getProperty())) 
{ 
    $result=$object->getRelatedObject()->getPreperty()->formatProperty(); 
} 
echo $result; 
?> 

は少し読みやすくthatsのtry/catchブロックであなたの

echo $object->getRelatedObject()->getProperty()->formatProperty(); 

をラップ:あなたが特定の方法は、中に存在することを確認するを使用することができます

+0

ありがとうございます。しかし、私が必要としたのは、読みやすいテンプレートソリューションで、普通のPHPスクリプトではありません。この例では、テンプレート言語としてPHPを使用しています(明らかではありませんか?) – Dziamid