Лучше, чем несколько, если? - PullRequest
0 голосов
/ 07 мая 2019

Лучший способ, чем множественное условие if в php?Слишком много условий, поэтому мне нужно что-то более простое и эффективное ... и вы можете показать мне примеры?!

if($_GET['id']=="4") { 
     try {
     $ids = '4,246,226';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}
if($_GET['id']=="246") { 
     try {
     $ids = '246';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}
if($_GET['id']=="226") { 
     try {
     $ids = '226';
     $notin = '1';
     $parent_forum = 'php_forums.parent_id';
} catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
                         }
}

1 Ответ

1 голос
/ 07 мая 2019

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

Так, например, как уже упоминалось в комментариях, хорошей заменой для if conditions являются switch cases.

Пример переключения случаев

Я не знаю всей структуры вашего вопроса, но я предоставлю решение о том, как я это сделаю.

/**
 * @throws Exception
 */
public function doSomethingWithGET()
{
    $notin          = 1;
    $parent_forum   = 'php_forums.parent_id';

    switch ($_GET['id']) {
        case '4':
        case '246':
        case '226':
            $ids = $_GET['id'];
            break;
        default:
            throw new Exception('Specify your error message here');

    }
}

Единственная причина, по которой я сгруппировал случаи переключения, заключается в том, что, казалось, ничего не изменилось вваш код, который оправдывает четкое разделение, НО, чтобы вы знали, что вы можете разделить случаи, чтобы они были очень конкретными, в зависимости от ваших идентификаторов, ИЛИ сгруппировать определенные идентификаторы, если только несколько ведут себя одинаково, в то же время разделяя конкретные идентификаторы для очень специфических вариантов поведения.

Вызовы методов

Этот сценарий является просто другим способом решения той же проблемы.Только для хихиканья и игривости :) Я уверен, что у него есть свои собственные игровые случаи, точно так же, как get_class может избежать того, чтобы мы постоянно создавали switch case для фабричных классов, но, как упоминалось ранее, все зависит от вашей идеи:)

class Test
{
   /**
    * @var array $idsAndActions
    **/
    protect $idsAndActions;

    public function __construct ()
    {
        $this->idsAndActions = [
            '4'   => 'doSomethingWithGET',
            '246' => 'doSomethingWithGET',
            '226' => 'somethingDifferent',
        ];
    }


    public function parseGet ()
    {
        if (array_key_exists($_GET['id'], $this->idsAndActions)) {
            $methodCall = $this->idsAndActions[$_GET['id']];
            if (method_exists($this, $methodCall)) {
                $this->$methodCall();
                //add here more code for success events
            }
        }

        echo '[Error] Your message';
        //You can also throw an exception, which I would advice depending on who calls this :)
    }

    public function doSomethingWithGET ()
    {
        $this->notin = 1;
        $this->parent_forum = 'php_forums.parent_id';
        $this->ids = $_GET['id'];

    }

    public function somethingDifferent ()
    {
        $this->notin = 20;
        $this->parent_forum = 'another_thing_here';
        $this->ids = $_GET['id'];
    }

}

Надеюсь, что это поможет вам дать некоторые идеи о том, как вы можете решить эту проблему или найти решение, которое лучше всего подходит вам!:)

ПРИМЕЧАНИЕ: Я знаю, что это не упоминается, НО, если вы используете $_GET['id'], сделайте какой-нибудь доступ к DBs или выполните system commands, не забудьтевозможность system breach и sql injection.Никогда не доверяйте переменным, внешним по отношению к системе

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