Философията опит/улов не е тази, която описахте. Добрият начин да го използвате е да улавяте различни изключения в зависимост от това каква грешка се е случила. Например:
try {
$value = readDatabase();
writeDatabase($++value);
} catch (ReadErrorException $e) {
// do something
} catch (WriteErrorException $e) {
// do something
}
Ако искате да постигнете това, което търсите, можете да направите толкова просто, колкото да използвате и, ако не се нуждаете от повече код. Ако го направите, просто използвайте elseif.
Например вашият код може да стане:
if (
$zombie_killer -> board_with_nail == 'failed'
&& $zombie_killer -> machette == 'failed'
&& $zombie_killer -> shotgun == 'failed'
) {
$this -> panic;
}
Също така, добрият начин би бил използването на булеви стойности като атрибути:
if (
!$zombie_killer -> board_with_nail
&& !$zombie_killer -> machette
&& !$zombie_killer -> shotgun
) {
$this -> panic;
}
РЕДАКТИРАНЕ: След като прочетох вашите коментари за други отговори
Предлагам ви алтернативно решение въз основа на казаното от вас. Разбирайки, че $zombie_killer е клас, можете да създадете публичен метод с име, например, kill(). Този метод има достъп до публичните, частните и защитените атрибути на класа.
Първо ще напиша пример без изключения.
Вътре в класа:
public function kill()
{
if ($zombie_killer -> board_with_nail != 'failed') return true;
if ($zombie_killer -> machette != 'failed') return true;
if ($zombie_killer -> shotgun != 'failed') return true;
return false;
}
В другия файл, този, за който говорихме:
if (!$zombie_killer->kill()) {
$this->panic;
}
Както можете да видите, кодът е по-изчистен и поведението по подразбиране на функцията е да предположим, че зомбито няма да бъде убито, а изключителните случаи биха били, ако един от методите, използвани за убиване на зомбито, успее. Това е обратното на това, което обикновено мислим: бихме предположили, че можем да убием зомбито и изключителният случай би бил, ако всичко се провали. Но това е само философски въпрос, можете да обърнете кода и той пак ще работи.
Нека видим същото с изключения.
Файл на класа:
public function kill()
{
if (
$zombie_killer -> board_with_nail == 'failed'
&& $zombie_killer -> machette == 'failed'
&& $zombie_killer -> shotgun == 'failed'
) {
throw new NotKilledException();
}
}
Друг файл:
try {
$zombie_killer->kill();
} catch (Exception $e) {
$this->panic;
}
И така, виждате ли? Версията за изключение не е от голяма полза в този случай, защото все пак трябва да направите вложеното if, тъй като условието трябва да изпълни три различни вида неуспешни убийства. Изключението е да не убивате зомбито. Защото искате изключителният код $this->panic да бъде изпълнен.
Сега трябва да изберете какъв вид изпълнение ви подхожда повече. И двете са правилни и разработчиците ще го видят правилно и двете. Бих избрал обаче първия, защото с просто копиране можете да добавите повече типове убийства към вашия zombie_killer и е по-чист за четене.
person
elxordi
schedule
07.08.2012
if(($zombie_killer -> board_with_nail == 'failed') && ($zombie_killer -> machette == 'failed') && ($zombie_killer -> shotgun == 'failed'))
? - person Mahn   schedule 07.08.2012