PHP Переключатель ввода в строке Случай, когда целое число проиндексировано - PullRequest
1 голос
/ 29 января 2020

Я не знаю, что не так. PHP просто предположим, что index (int) 0 моего массива эквивалентно первому регистру Switch, и сгенерируем ошибку.

Предполагая, что я ввожу такой массив:

$config = [
    "testA" => true,
    "testB" => 22,
    0 => 0
];

Пример моего кода:

foreach($config as $name => $value) {
    switch($name) {
        case "testA":
            if (!is_bool($value)) throw new \Exception( "Configuration '$name' must be boolean.");
            $this->systemVarA = $value;
            break;
        case "testB":
            if (!is_int($value)) throw new \Exception( "Configuration '$name' must be integer.");
            $this->systemVarB = $value;
            break;
    }
}

Конечно, $ config ["testA"] и $ config ["testB] работают должным образом, но когда foreach достигает $ config [0], запускается сценарий" testA "и запускается приложение я исключение.

Обход, который я получил, перед Switch, приведёт переменную $ name вот так:

$name = (is_int($name) ? (string)$name : $name); // Used this because I already have other inline if

Но это похоже на ошибку. Я проверил в PHP 7.1, 7.3 и 7.4 на Windows хосте.

Ответы [ 2 ]

1 голос
/ 30 января 2020

В ответе Владимира правильно указана причина. Вот исправление: преобразуйте тестовое значение в строку, так как вы сравниваете со строками.

switch( (string) $name ) {
    ...
}

Да, вы можете использовать switch(TRUE){case ("testA" === $name): ... } «Инверсионный трюк», но на этом этапе вы можете ну просто используйте elseif!

1 голос
/ 29 января 2020

Это потому, что PHP использует оператор == в секции switch. Когда вы пытаетесь сравнить int (0) со строкой «testA», она всегда возвращает true. проверьте это:

if(0 == "some string") echo "Equals!";

Этот код печатает "Равно!".

...