Помогите разобраться: строка PHP

Статус
В этой теме нельзя размещать новые ответы.

Den1xxx

Постоялец
Регистрация
15 Янв 2014
Сообщения
290
Реакции
168
Что здесь происходит?
PHP:
isset($m[$e[$pk]]) ?: $m[$e[$pk]] = array();
Не совсем понятен оператор «?:» и последующее присвоение.

Я правильно понимаю, что здесь проверяется существование $m[$e[$pk]] и если его нет — определяется как пустой массив?

Я всегда встречал это в контексте присвоения в начале, например так
PHP:
$m[$e[$pk]] = isset($m[$e[$pk]]) ?: array();
и даже так было бы понятнее и привычнее.

Тогда я могу переписать это так:
PHP:
if(!isset($m[$e[$pk]])) $m[$e[$pk]] = array();
Количество символов то же, а работать будет так же?

Если это так, то в данном случае автор не сэкономил ни символа, однако дал -200 к понятности и сломал совместимость к PHP<5.3

Код отсюда Для просмотра ссылки Войди или Зарегистрируйся
 
Да, вы совершенно правы. И ваши оба варианта написания аналогичны по смыслу первому варианту.

Вообще тернарные операторы достаточно сильно сокращают код, но использовать их стоит с умом ибо путаницы в логику они вносят преизрядно...
 
Вообще тернарные операторы достаточно сильно сокращают код, но использовать их стоит с умом ибо путаницы в логику они вносят преизрядно...
Ну я когда подучил тернарные операторы, тоже много где применяю.
И иногда намного понятнее получается, чем if, часто просто короче.
Для того же, чтобы уверенно писать конструкцию, что я привёл, программист на 100% должен быть уверен, что порядок выполнения пойдёт по правильному пути.
Я в этом случае был не уверен.
Если уж «обфусцировать», то для уверенности я бы написал так:
PHP:
isset($m[$e[$pk]]) ?: ($m[$e[$pk]] = array());
И тогда бы на 100% был бы уверен, что порядок выполнения будет соблюден, как задумано.

А вот так работает под всеми версиями PHP, даже от 3:
Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
так то больше на бред смахивает. конструкция:
PHP:
$m[$e[$pk]] = isset($m[$e[$pk]]) ?: array();
в случае существования переменной $m[$e[$pk]], просто присвоит ей true, что перезапишет изначальное значение переменной ... что то я не улавливаю прикладной смысл.

если уж и использовать, то без isset:
PHP:
$m[$e[$pk]] = $m[$e[$pk]] ?: array();

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

А вообще, тернарные операторы удобно использовать в ретёрнах:
PHP:
return $result ?: false;
 
Мы таким образом избегаем ошибок типа Notice, хотя в данном примере это не будет заметно, но возможно программист привык уже так писать и делает не задумываясь.

Два кода для сравнения:
PHP:
<?php
error_reporting(E_ALL | E_NOTICE);
$m = $m ?: array();
Notice: Undefined variable: m in /in/8gtk8 on line 3

PHP:
<?php
error_reporting(E_ALL | E_NOTICE);
isset($m) ?: $m = array();
выполнится без ошибок

В конструкции if(!isset( , очень легко пропустить восклицательный знак ! и убить потом очень много времени на поиск ошибки. Тернарный в данном случае нагляднее. Писать в одну строку и без фигурных скобок if, сейчас тоже не популярно, примерно из тех же соображений.

Чаще всего встречается через
PHP:
$m = isset($m) ? $m : array();
Но тут несколько лишних символов.

PS Для просмотра ссылки Войди или Зарегистрируйся функция рекурсии ужасна (слишком много аргументов), при рефакторинге потратите дофига времени чтобы понять как это работает. Там действительно нужен настолько универсальный комбайн и это нельзя разбить на несколько этапов?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху