Ja bym zrobił jeszcze inaczej:
if($bagietka !== 5) {
return; // lub return false, lub throw new InvalidArgumentException, zależy co chcemy zakomunikować wywołującemu metodę
}
// zrób coś z bagietką
To się nazywa early return
, dzięki któremu unikamy niepotrzebnego zagnieżdżenia.
Jeżeli chodzi o settery, to częstszą praktyką jest coś, co się nazywa fluent interface, czyli:
class Foo {
private $a;
private $b;
public function setA($a)
{
$this->a = $a;
return $this;
}
public function setB($b)
{
$this->b = $b;
return $this;
}
}
$foo = new Foo();
$foo->setA(1)->setB(2);
Zazwyczaj się to spotyka, jak masz do czynienia z jakimś obiektem typu builder, czyli coś składasz, np. zapytanie:
$builder = $this->createQueryBuilder()->select('*')->from('tabela')->join('...')
Więc jak widać nie ma tu miejsca na return true/false. Osobiście chyba się nie spotkałem z tym, żeby setter zwracał true/false. Ja bym zrobił coś takiego:
public function setEmail($email)
{
if (strpos($email, '@') === false) {
throw new \InvalidArgumentException("Błędny email");
}
$this->email = $email;
}
Wtedy mam pewność, że ktoś musi coś z tym zrobić. Jeżeli zwrócisz false, to utrudnisz debuggowanie, bo błąd przemknie się niepostrzeżenie, bo ktoś może zapomnieć o sprawdzeniu i zamiast tak:
if(!$obj->setEmail($email)) {
// oops cos sie nie udało, ktoś chyba podał zły email
}
zrobi tak:
$obj->setEmail($email);
// jedziemy dalej z logiką
// 15000 linii kodu dalej próbujemy wysłać email, ooops email jest pusty oO przecież był set.. tylko się nie udał bo zwrócił false oO
I coś się zesra, ale dopiero w miejscu, gdzie ten Twój email faktycznie musi być emailem, bo przeprowadzasz na nim jakies operacje. I wtedy zaczyna się szukanie.. czemu email jest pusty. Jak walniesz exception, to się ktoś od razu zorientuje ;)