2017-02-23 3 views
2

Magentoのコードベースには、オブジェクトを返すメソッドや、オブジェクトが見つからない場合にfalseを返すメソッドがいくつかあります。PHPでobjectまたはfalseを返す動機

は、次の例を考えてみましょう:

/** 
* Get block object by name 
* 
* @param string $name 
* @return \Magento\Framework\View\Element\AbstractBlock|bool 
*/ 
public function getBlock($name) 
{ 
    $this->build(); 
    if (isset($this->_blocks[$name])) { 
     return $this->_blocks[$name]; 
    } else { 
     return false; 
    } 
} 

私はむしろ、nullを返すか、いくつかのケースでは、例外を投げるだろうと私は個人的にこれで混乱しています。

これがMagentoで行われる理由は何ですか?これは一般的なPHPのものですか?

+0

'($ result){$ result-> doSomething();}' –

+0

で結果をテストできるのは個人的な好みの問題だと思います。オブジェクトの再生中にヌルチェックを行います。この場合、 'if($ returnedObject)'のようにします。 –

答えて

0

私はそれは悪い習慣だと思います。呼び出し元で戻り値をチェックする必要があるため、メソッド連鎖は不可能です。

私は個人的にこのような場合に個別のチェックメソッドを持つ傾向があり、ゲッターがエラーで例外をスローする傾向があります。以下のような:

public function hasBlock($name) { 
    return isset($this->_blocks[$name]); 
} 

public function getBlock($name) { 
    if (!$this->hasBlock($name)) { 
     throw new \LogicException("No block of name $name."); 
    } 
    return $this->_blocks[$name]; 
} 

あなたは常にgetBlock()からシングルタイプの戻り値を期待するため、$obj->getBlock("name")->doStuff()のようなチェーンのメソッドを持つことができますこの方法。

例外の種類はコンテキストによって異なります。私はLogicExceptionが適切であると考えています。なぜなら、使用前にブロックが存在するかどうかをチェックしないプログラミングエラーです。

もちろん、ブロックの存在を確認せずに、RuntimeErrorなどをスローして、アプリケーションロジックの上位レベルのものを処理することもできます。

関連する問題