表示している条件は、ビット マスクを使用して非常にうまくモデル化できます。
$messages = [
16 => 'No Visa Required',
8 => 'Visa can be obtained ...',
4 => ...
];
次に、個別の変数をビットマスクにフォーマットする必要があります。
$bitmask = ($no_required ? 16 : 0)
| ($on_arrival ? 8 : 0)
| ...;
次に、適切なメッセージを選択します。
echo $messages[$bitmask];
注: マジック ナンバーの代わりに定数を使用することは、ここでもほぼ必須であるため、次のようになります。
define('VISA_NONE', 1);
define('VISA_ON_ARRIVAL', 2);
...
$messages = [
VISA_NONE => 'No Visa Required',
...,
VISA_US | VISA_UK => 'You need USA/UK visa'
];
// using multiplication instead of conditionals, as mentioned in the comments
$bitmask = $no_required * VISA_NONE
| $on_arrival * VISA_ON_ARRIVAL
| ...;
echo $messages[$bitmask];
全体を適切なクラスでラップすると、読みやすく、保守しやすく、再利用可能なビジネス ロジックの一部が得られます。
class Visa {
const NONE = 1;
const ON_ARRIVAL = 2;
...
protected $messages = [];
protected $visa;
public function __construct() {
$this->messages = [
static::NONE => 'No Visa Required',
...,
static::US | static::UK => 'You need USA/UK visa'
];
}
/**
* @param int $type One of the class constants.
* @param bool $enabled Whether this type of visa is required.
*/
public function set($type, $enabled) {
$this->visa = $this->visa | $type * (int)(bool)$enabled;
}
public function getMessage() {
return $this->messages[$this->visa];
}
}
$visa = new Visa;
$visa->set($visa::NONE, $no_required);
$visa->set($visa::ON_ARRIVAL, $on_arrival);
echo $visa->getMessage();