Багато мов програмування мають функцію з'єднання (повертає перше не-NULL значення, наприклад ). PHP, на жаль у 2009 році, ні.
Який був би хороший спосіб впровадити його в PHP, поки PHP сам не отримає функцію злиття?
Багато мов програмування мають функцію з'єднання (повертає перше не-NULL значення, наприклад ). PHP, на жаль у 2009 році, ні.
Який був би хороший спосіб впровадити його в PHP, поки PHP сам не отримає функцію злиття?
Відповіді:
У php 5.3 є новий оператор, який робить це: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
повертають false
. Оператор справді здоровий.
PHP 7 представив справжнього оператора з'єднання :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Якщо значення до ??
цього не існує, або це null
значення після ??
взяття.
Поліпшенням у порівнянні згаданим ?:
оператором є те, що ??
також обробляє невизначені змінні без викидання an E_NOTICE
.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
над ??
, однак, полягає в тому, що він також поєднує порожні значення, що ??
не робить. Аналогічно поведінці логічного оператора АБО у JavaScript (тобто $val || 'default'
), я вважаю ?:
б більш практичною формою з’єднання, якщо в нашій практиці ми в кінцевому підсумку виявляємо, що обробляємо як порожні, так і нульові однаково (тобто $val ?: 'default'
). І якщо ви хочете ще більше змусити проблему і проковтнути E_NOTICE
, ви можете це навіть аргументувати:echo @$val ?: 'default';
Перший хіт для "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()));
}
coalesce
повинен повернути перший ненульовий аргумент, який він зустрічає, який би включав FALSE
. Ця функція буде відкинута FALSE
, мабуть, не те, що має на увазі оп (принаймні, не те, що я хотів би вийти з coalesce
функції).
Варто зазначити, що завдяки обробці PHP неініталізованими змінними та індексами масиву будь-який вид злиття функції має обмежене використання. Мені б хотілося це зробити:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
Але це в більшості випадків призведе до помилки PHP з E_NOTICE. Єдиний безпечний спосіб перевірити існування змінної перед її використанням - це використовувати її безпосередньо в порожній () або isset (). Тернарний оператор, запропонований Кевіном, є найкращим варіантом, якщо ви знаєте, що всі варіанти вашої спільної передачі, як відомо, ініціалізовані.
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).
??
щоб зробити цю дуже поширену операцію більш стислою.
Переконайтесь, що ви точно визначили, як ви хочете, щоб ця функція працювала з певними типами. 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>';
}
Як бачите, порожній () повертає істину для всіх цих, але is_null () робить це лише для двох з них.
Я розкриваю відповідь, яку опублікував Етан Кент . Ця відповідь відкине ненульові аргументи, які оцінюються як хибні завдяки внутрішній роботі array_filter , що не є тим, що coalesce
функція зазвичай виконує. Наприклад:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
На жаль
Для подолання цього потрібен другий аргумент та визначення функції. Функція дзвінка відповідає за те, array_filter
чи потрібно додавати поточне значення масиву до масиву результатів:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
Було б добре, якби ви могли просто передати isset
або 'isset'
як другий аргумент array_filter
, але такої удачі немає.
PHP 5.3+ з закриттями:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
Демо: https://eval.in/187365
??
з нульовим згортанням для PHP 7.