И в операторе if (php)
Автор: SysaninАвг 14
Совет по оптимизации логических выражений (в частности в if): если в выражении используются только операторы "и" (&&), то интертпретатор последовательно проверяет значения подвыражений, заключеных между оператором "и". Если какое-то из них возращает false, то далее выражения не проверяются и все выражение возращает false. Например:
В даном случае мы не увидим сообщения "test". Потому что первое подвыражение вернуло false, и далее подвыражения не проверялись.
Данное свойство следует учитывать, когда в операциях сравнения используются возращаемые значения ресурсоемких функций или левее размещать подвыражения которые наиболее вероятно будут ложными. Тут уже надо смотреть какой случай.
5 коммент.
Пишет Ales | дата: 14 июля 2010 в 16:24
Еще в ПХП есть огромное неудобство с логическими операторами - они возвращает true или false, а в Perl’e например возвращает значение первого истинного выражения выражения или переменной, или false.
Например в PHP
$a = 0; $b = 4; $c = 0;
$a = ($a || $b || $c);
$a будет ‘true’
в Перле $a будет равно 4, что позволяет делать код намного компактней и удобочитаемым.
Можно как-нибудь в пхп это обойти?
Пишет Sysanin | дата: 14 июля 2010 в 17:56
У меня не приходит в голову как. Но вобще, если это логическая операция, почему она должна возращать что-то отличное от логического значения? Вполне логично.
Пишет Ales | дата: 15 июля 2010 в 13:13
Формально да, но по сути любой скаляр, отличный от нуля или не пустой массив есть логическое TRUE, и наоборот, поэтому оператор мог-бы возвращать любое значение при TRUE, как в перле реализовано, ну или в С++ можно вообще переопределить оператор.
Это избавило-бы от развесистых if…elsif…elsif..else, можно было-бы писать в одну строчку: $var = $_GET['id1'] || $_GET['id2'] || $_GET['id3'] ….
Пишет Sysanin | дата: 15 июля 2010 в 14:46
ну можно что-нибудь типа этого использовать:
$value = false;
if (count($_GET) > 0) {
foreach ($_GET as $val) {
if ($val) {
$value = $val;
break;
}
}
}
или
$value = false;
foreach (array(’id1′, ‘id2′, ‘id3′) as $id) {
if ($_GET[$id]) {
$value = $_GET[$id];
break;
}
}
Пишет Ales | дата: 15 июля 2010 в 15:26
Это верно, только код неимоверно-бы сократился, если вместо любого из этого вариантов писать одну строчку. Да и count($_GET) и foreach - лишняя нагрузка на проц. Буду ждать следующих версий php, пока использовать один из этих вариантов