Этот код не очень удобочитаемый или поддерживаемый. PHP 7 имеет IFFY, поэтому я бы предложил переписать его следующим образом:
$full_name = $flag
? null
: (function($params) {
$tmp_name = trim(strip_tags((string)@$params['full_name']));
return (strlen($tmp_name) > 3 and strlen($tmp_name) < 30)
? $tmp_name
: out('The full name must be 3-30 characters', 'Invalid full name');
})($params);
Ваш код можно заставить работать. Проблема заключается в приоритете операций. Оператор &&
имеет более высокий приоритет, чем оператор присваивания, поэтому в этом случае присваивание $ tmp_name не выполняется до оценки логического &&
. Это проиллюстрировано на диаграмме операторов .
. Чтобы сначала выполнить назначение, вам нужно заключить назначение в дополнительный набор символов.
Говоря лично, я не хочу, чтобы мне приходилось кодировать подобные вопросы, если не нужно, но, поскольку вы хотели получить объяснение, вот фиксированная версия:
$full_name = $flag ? null : ((($tmp_name = trim(strip_tags((string)@$params['full_name'])))
&& (strlen($tmp_name) > 3 && strlen($tmp_name) < 30))
? $tmp_name
: out('The full name must be 3-30 characters', 'Invalid full name'));