Коалесцировать функцию для PHP?
многие языки программирования имеют функцию coalesce (возвращает первое ненулевое значение,пример). PHP, к сожалению, в 2009 году, нет.
Что было бы хорошим способом реализовать его в PHP, пока сам PHP не получит функцию coalesce?
9 ответов:
в php 5.3 есть новый оператор, который делает это:
?:// A echo 'A' ?: 'B'; // B echo '' ?: 'B'; // B echo false ?: 'B'; // B echo null ?: 'B';
PHP 7 представил реальный оператор коалесцируют:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'если значение перед
??не существует илиnullзначение после это.улучшение по сравнению с упомянутым
?:оператора, что??также обрабатывает неопределенные переменные, не выдавая себяE_NOTICE.
первый хит для "php coalesce" на google.
function coalesce() { $args = func_get_args(); foreach ($args as $arg) { if (!empty($arg)) { return $arg; } } return NULL; }
Мне очень нравится ?: оператор. К сожалению, он еще не реализован в моей производственной среде. Поэтому я использую эквивалент этого:
function coalesce() { return array_shift(array_filter(func_get_args())); }
стоит отметить, что из-за обработки PHP неинициализированных переменных и индексов массива, любой вид коалесцирующей функции имеет ограниченное применение. Я хотел бы иметь возможность сделать это:
$id = coalesce($_GET['id'], $_SESSION['id'], null);но это в большинстве случаев приведет к ошибке PHP с E_NOTICE. Единственный безопасный способ проверить существование переменной перед ее использованием-использовать ее непосредственно в empty () или isset (). Тернарный оператор, предложенный Кевином, является лучшим вариантом, если вы знаете, что все варианты в вашем известно, что коалесцирование инициализируется.
убедитесь, что вы точно определяете, как вы хотите, чтобы эта функция работала с определенными типами. PHP имеет широкий спектр функций проверки типов или аналогичных функций, поэтому убедитесь, что вы знаете, как они работают. Это пример сравнения is_null () и empty ()
$testData = array( 'FALSE' => FALSE ,'0' => 0 ,'"0"' => "0" ,'NULL' => NULL ,'array()'=> array() ,'new stdClass()' => new stdClass() ,'$undef' => $undef ); foreach ( $testData as $key => $var ) { echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>"; echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>"; echo '<hr>'; }Как вы можете видеть, empty() возвращает true для всех из них, но is_null () делает это только для 2 из них.
я расширяю ответ, опубликованный Этан Кент. Этот ответ отбросит ненулевые аргументы, которые оцениваются как false из-за внутренней работы array_filter, который не то, чему
в настоящее время я использую это, но мне интересно, не может ли он быть улучшен с помощью некоторых новых функций в PHP 5.
function coalesce() { $args = func_get_args(); foreach ($args as $arg) { if (!empty($arg)) { return $arg; } } return $args[0]; }
на PHP 5.3+, с крышками:
function coalesce() { return array_shift(array_filter(func_get_args(), function ($value) { return !is_null($value); })); }
Comments