использовать переключатель === сравнение не == сравнение в PHP - PullRequest
67 голосов
/ 19 августа 2010

Есть ли способ сделать так, чтобы следующий код по-прежнему использовал переключатель и возвращал b, а не a? Спасибо!

$var = 0;
switch($var) {
    case NULL : return 'a'; break;
    default : return 'b'; break;
}

Конечно, используя операторы if, вы сделаете это так:

$var = 0;
if($var === NULL) return 'a';
else return 'b';

Но для более сложных примеров это становится многословным.

Ответы [ 15 ]

0 голосов
/ 18 марта 2019

Создайте класс, подобный утверждению, и поместите в него любую логику; до тех пор, пока "истинные" методы возвращают $this (и ничего больше, чтобы избежать ложных срабатываний.)

class Haystack
{
    public $value;

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function isExactly($n)
    {
        if ($n === $this->value)
            return $this;
    }
}

$var = new Haystack(null);

switch ($var) {
    case $var->isExactly(''):
        echo "the value is an empty string";
        break;

    case $var->isExactly(null):
        echo "the value is null";
        break;
}

Или вы можете поместить свой переключатель в фактический класс:

class Checker
{
    public $value;

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function isExactly($n)
    {
        if ($n === $this->value)
            return $this;
    }

    public function contains($n)
    {
        if (strpos($this->value, $n) !== false)
            return $this;
    }

    public static function check($str)
    {
        $var = new self($str);

        switch ($var) {
            case $var->isExactly(''):
                return "'$str' is an empty string";
            case $var->isExactly(null):
                return "the value is null";
            case $var->contains('hello'):
                return "'$str' contains hello";
            default:
                return "'$str' did not meet any of your requirements.";
        }
    }
}

var_dump(Checker::check('hello world'));   # string(28) "'hello world' contains hello"

Конечно, в этот момент вам может понадобиться переоценить то, что вы хотите сделать с тем, что вы проверяете, и вместо этого использовать реальную библиотеку проверки.

0 голосов
/ 04 апреля 2017

Экстраполируя из вашего примера кода, я думаю, у вас есть куча обычных случаев и один особый случай (здесь null).

Самое простое, что я могу понять, это разобраться с этим делом до переключения:

if ($value === null) {
    return 'null';
}

switch ($value) {
    case 0:
        return 'zero';
    case 1:
        return 'one';
    case 2:
        return 'two';
}

Возможно, также добавьте комментарий, чтобы запомнить, что null неожиданно совпадет с регистром 0 (также наоборот, 0 будет соответствовать регистру null).

0 голосов
/ 27 июля 2014

Один из лучших способов - проверить значение NULL, используя is_null

<?php
echo getValue();
function getValue()
{
    $var = 0;   
    switch(true) {
        case is_null($var) : return 'a'; break;
        default : return 'b'; break;
    }
}
?>
0 голосов
/ 19 августа 2010

Вы также можете включить тип переменной:

switch (gettype($var)) {
...
}
0 голосов
/ 19 августа 2010

Это невозможно.

Однако вы можете поместить if заявления внутрь switch:

switch($var) {
    // Loose cases here

    case 0:
        if($var === NULL) {
            return 'a';
        }

        // Fall through

    default:
        return 'b';
}

Или просто:

switch($var) {
    // Loose cases here

    default:
        if($var === NULL) {
            return 'a';
        }

        return 'b';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...