2017-02-23 11 views
2

В кодовой базе Magento существует несколько методов, которые возвращают объект или false, если объект не найден.Мотивация для возврата объекта или false в PHP

Рассмотрим следующий пример:

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

Я лично запутываемый это, как я предпочел бы вернуть нулевой или выбросить исключение в некоторых случаях.

Есть ли какая-то конкретная мотивация, почему это делается в Magento? Это общая вещь PHP?

+0

Я бы предположил, что это просто вопрос личного предпочтения, чтобы иметь возможность проверить результат с помощью 'if ($ result) {$ result-> doSomething();}' –

+0

Я думаю, это дизайнерское решение. Мы выполняем нулевую проверку во время игры с объектами, поэтому в этом случае мы будем делать это как 'if ($ returnObject)'. –

ответ

0

Я думаю, что это плохая практика. Вы должны проверить возвращаемое значение у вызывающего, поэтому цепочка методов невозможна.

Я лично имею тенденцию иметь отдельный метод проверки в таких случаях и при этом getter генерирует исключение при ошибке. Такие, как:

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 или такие брошенные и обрабатывать те, что находятся на верхнем уровне в логике приложения.

Смежные вопросы