Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странное поведение PHP. Ассоциативность в тернарном операторе.  (Прочитано 9607 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 13-02-2012 11:43 » 

Пример:

Код: (PHP)
    public function newError($message, $code)
    {
        if ($code === false)
        {
            $code = isset($this->errorNumbers[$message]) ?
                $this->errorNumbers[$message] :
                isset($this->errorNumbers['']) ?
                    $this->errorNumbers[''] : $code;
        }
    }

По задумке, если $code - ложь, то в массиве errorNumbers ищется код ошибки по ее тексту. Если такой записи в массиве нет, то используется ключ '' (пустая стока) как значение по умолчанию.

Но вне зависимости от наличия errorNumbers[$message] результатом будет errorNumbers['']!

Лечится оборачиванием части выражения скобками:

Код: (PHP)
    public function newError($message, $code)
    {
        if ($code === false)
        {
            $code = isset($this->errorNumbers[$message]) ?
                $this->errorNumbers[$message] :
                (isset($this->errorNumbers['']) ?
                    $this->errorNumbers[''] : $code);
        }
    }

Я что-то не понимаю или это бага?

http://ru.php.net/manual/en/language.operators.precedence.php
По ссылке указана левая ассоциативность.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-02-2012 21:21 » 

Я стараюсь скобки расставлять где возможна любая неоднозначность. Учитывая, что современные редакторы умеют подсвечивать парные скобки, ИМХО читабельность только повышается.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 13-02-2012 21:27 » 

Я стараюсь такого вообще не писать
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-02-2012 21:34 » 

А я наоборот предпочитаю тернарный оператор if-у. Компактнее, но не в ущерб читаемости. Но с данной траблой столкнулся впервые.

Добавлено через 6 минут и 25 секунд:
Код: (PHP)
<?php

function test($a, $b)
{
    echo
        "$a$b:",
        ($a ? 1 : $b ? 2 : 3),
        "\n";
}

test(0, 0);
test(0, 1);
test(1, 0);
test(1, 1);

?>

00:3
01:2
10:2
11:2

Пытаюсь понять логику.
« Последнее редактирование: 13-02-2012 21:42 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 14-02-2012 03:13 » 

я просто ставлю скобки и не задумываюсь в таких случаях

($a ? 1 : ($b ? 2 : 3) ),

Добавлено через 1 минуту и 20 секунд:
а у тебя оно автоматом вот так расставилось, похоже
(($a ? 1 : $b) ? 2 : 3 ),
« Последнее редактирование: 14-02-2012 03:14 от Алексей1153 » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-02-2012 05:58 » new

Да, Леш, видимо так.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines