1 Востаннє редагувалося miroslav.chandler (24.02.2013 19:33:58)

Тема: тернарний оператор.

сьогодні довгий час тупив над тернарним операторм і чого ж він не правильно працює)

echo $data->name .' '. $data->getSecondName() ? 'qwe' : '';

чому завжди буде виводитися qwe, в не залежності від булевого результату getSecondName()?

виявляється, шо PHP цей рядок інтерпретує як конкатенацію $data->name з умовою, тобто:

if($data->name .' '. $data->getSecondName())
    echo 'qwe';
else
    echo '';

через динамічну типізацію похапе, булевий тип приєдная до строки і в результаті в нас буде строка.
а майже вся строка, в нас тру



тобто має бути так:

echo $data->name .' '. ($data->getSecondName() ? 'qwe' : '');
Подякували: Очі.завидющі2

2

Re: тернарний оператор.

Пріоритет у тернарного оператора дуже низький.

Подякували: miroslav.chandler1

3

Re: тернарний оператор.

Дужки наше все. Особливо коли використовуємо якісь операції зі строками.

4

Re: тернарний оператор.

З сайту php.net

$a = true ? 0 : true ? 1 : 2; 
// (true ? 0 : true) ? 1 : 2 = 2

якщо рідко таке пишете тоді важко зрозуміти чому так оптимальний варіант це спростити умову і розкинути її на 2 рядки тоді буде чітко і ясно як працює код.

Для себе склав одне правило якщо в на умову впливає більше 1го елементу краще використовувати дужки в подальшому підтримка коду буде простіша.
Поясню на коді:
Як я не пишу

$state = $user and $admin ? 'admin' : 'user';

Як я пишу:

$state = ( $user and $admin ) ? 'admin' : 'user';

Можливо дані поради допоможуть в майбутньому ;)

Подякували: Chemist-i1

5

Re: тернарний оператор.

доречі в and і && різні пріорітети, так як в or і || :)