2013-03-27 4 views
1

Это самый простой в мире php-оператор if, который когда-либо создавался, и когда-либо я не могу понять, как это сделать, в одном. По существу, у меня застыл момент, и мне нужна помощь общин.Не могу понять, как это сделать, если оператор

Это моя функция:

protected function _traverse_options($name, $type = ''){ 

    if(isset($this->_options[$name][$type])){ 
     echo $this->_options[$name][$type]; 
    } 
} 

если заявление мне нужно, чтобы проверить три вещи:

  • Если тип не является нулевым но типа не является «до»
  • , если тип не является нулевым , но Тип не является «после»

Я попытался сделать:

if($type != '' && $type != 'before' || $type != '' && $type != 'after'){} 

Как когда-либо, что не работает.

Я знаю, что это просто, но я не могу понять это? следует || be && ??

+0

Не имеет ли '&&' более высокий приоритет, чем '||'? – Izkata

+1

Кроме того, хотя 'null == ''', вы должны использовать '$ type === null' (или'! == ') - это более точно и реже вызывает странные ошибки. Например, что если '$ type' действительно был' '' 'по какой-то причине? Или [что-то другое, которое считается равным '' ''] (http://www.php.net/manual/en/types.comparisons.php)? – Izkata

ответ

0

Это сделает работу:

if($type != '' && $type != 'before' && $type != 'after'){} 
0

Таким образом, любая непустая строка, которая не является ни before, ни after.

if ('' !== $type && !in_array($type, array('before', 'after'))) 
{ 

} 
0

Если я понял правильно, вам не нужно или это заявление. Попробуйте с:

if (!is_null($type) && strlen($type) > 0 && $type !== 'before' && $type !== 'after') { ... } 
0

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

if ($type != null && ($type !== 'before' && $type !== 'after')) { 
    // ... 
} 

Если вы не будете осторожны, вы можете в конечном итоге с проблемами, такими, как в математике, где расчет может дать две разные результаты в зависимости от того, какую операцию вы делаете первый. Например, 2*5-10, который может быть либо 0, либо -10 в зависимости от того, в каком порядке вы умножаете или вычитаете: (2*5)-10 или 2*(5-10).

Вы также можете сделать это немного легче следовать, разбивая логики в переменные, делая if заявление проще:

$notNull = ($type != null); 
$notBeforeAndAfter = ($type !== 'before' && $type !== 'after'); 
if ($notNull && $notBeforeAndAfter) { 
    // ... 
} 

Если вы точно знаете, что переменная $type должна содержать, то вы можете также использовать a switch заявление. Гораздо легче понять:

switch ($type) { 
    case 'before': 
     echo '$type is "before"'; 
     break; 
    case 'after': 
     echo '$type is "after"'; 
     break; 
    // $type is not 'before' or 'after', which means that 
    // it is something else which we cannot use... 
    default: 
     echo '$type is an unknown value. Error maybe?'; 
     break; 
}