Некоторое время я задавался вопросом, насколько эффективно (с точки зрения ресурсов и скорости) использовать ассоциативные массивы в качестве трансляторов?
Например, скажем, у нас есть класс калькулятора, который получает объект операции, а затем вызывает функцию для выполнения, run()
, Чтобы проверить, какую операцию пытается использовать пользователь, мы можем выполнить if()
или же switch()
а затем установить правильную операцию или, мы можем сделать что-то вроде new $operations[$operation]
где $operation
представляет строку как +
или же -
и $operations
Значения массива для этих ключей (соответственно) Addition
а также Subtraction
, Делая это, мы можем создать экземпляр нужной нам операции без написания switch()
или же if()
заявление.
Демонстрация кода:
class Calculator {
protected $result = null,
$operands = [],
$operation;public function setOperands() {
$this->operands = func_get_args();
}
public function setOperation(Operation $operation)
{
$this->$operation = $operation;
}
public function calculate() {
foreach($this->operands as $num) {
if( ! is_number($num))
throw new \InvalidArgumentException;
$this->result = $this->operation->run($num, $this->result);
}
}
}
interface Operation {
public function run($num, $current);
}
class Addition implements Operation{
public function run($num, $current) {
return $num + $current;
}
}
class Subtraction implements Operation {
public function run($num, $current) {
return $num - $current;
}
}
Теперь, когда мы используем эти классы:
$calculator = new Calculator();
// input from user
$operation = "+";$calculator->setOperands(1,2,3);
/**
* One way to set the operation
*/
// set the operation
switch($operation) {
case '+':
$calculator->setOperation(new Addition);
break;
case '-':
$calculator->setOpration(new Subtraction());
break;
// and so on..
}
$calculator->calculate();
/**
* Second way to set the operation
*/
$operations = ['+' => 'Addition', '-' => 'Subtraction']; // can add more
$calculator->setOperation(new $operations[$operation]);
$calculator->calculate();
Это второй способ установки операции эффективен (в смысле ресурсов и скорости)?
Давайте думать, у меня есть массив
$acronyms = ['AFAIK' => 'As far as I know', 'MVP' => 'Most valuable player'];
И Строка, чтобы получить Перевод
$string = "AFAIK I do the MVP";
Сейчас сделаю это
echo strtr($string,$acronyms);
Теперь мой вывод будет
As far as I know I do the Most valuable player
Других решений пока нет …