...

Използване на съкратени оператори за php

най-често използваните съкратени оператори в php 7+
преди 2 месеца
php

Трикомпонентен оператори

Трикомпонентният оператор е съкратена версия на структурата if {} else {}. Обикновенно пишем

if ($condition) {
    $result = 'foo' 
} else {
    $result = 'bar'
}

но ако искаме да го напишем същото, но съкратено:

$result = $condition ? 'one' : 'two';

Тук буквално можем да прочетем: ако $condition е вярно - тогава вземи левият операнд (в ляво от :), ако не е - вземи десният операнд. В случая $condition може да бъде и обикновен if:

$result = (567 > 2) ? 'one' : 'two';

Ако пък не ни трябва ляв операнд - може да го спестим, примерно

$result = $initial ?: 'default';

Тук ако $initial не е false - $result ще приеме стойността $initial, но ако е false - не приеме стойност default. Естествено - може, да ползваме скъсените записи да ги навържем:

$result = $firstCondition
    ? 'truth'
    : $elseCondition
        ? 'elseTrue'
        : 'elseFalse';

Важно е да се отбележи, че в този пример се проверява първо условието $elseCondition. Ако обаче $firstCondition е true - няма да има значение условието $elseCondition.

Null оператор за обединяване

Null coalescing operator

Достъпен от PHP 7.0, подобен на Трикомпонентния оператор, но в лявата част се държи като функцията isset. Това прави операторът доста използваем при масиви и задаване на стойности по подразбиране, когато променливата не е сетната:

$undefined ?? 'fallback'; // 'fallback'

$unassigned;
$unassigned ?? 'fallback'; // 'fallback'

$assigned = 'foo';
$assigned ?? 'fallback'; // 'foo'

'' ?? 'fallback'; // ''
'foo' ?? 'fallback'; // 'foo'
'0' ?? 'fallback'; // '0'
0 ?? 'fallback'; // 0
false ?? 'fallback'; // false

Този оператор е удобно използваем с масиви, защото действа като isset. Това означава, че можете бързо да проверите наличието на ключове, дори и вложените ключове, без да пишете подробни изрази.

$input = [
    'key' => 'key',
    'nested' => [
        'key' => true
    ]
];

$input['key'] ?? 'fallback'; // 'key'
$input['nested']['key'] ?? 'fallback'; // true
$input['undefined'] ?? 'fallback'; // 'fallback'
$input['nested']['undefined'] ?? 'fallback'; // 'fallback'

null ?? 'fallback'; // 'fallback'

Първият пример може да се изпише и чрез Трикомпонентен оператор:

$output = isset($input['key']) ? $input['key'] : 'fallback';

Важно е да се отбележи, че не можем да използваме съкратени оператори за проверка дали ключ от масив съществува. Това ще върне грешка или булева стойност, вместо стойноста на ключа:

// Връща `true` вместо стойността `$input['key']`
$output = isset($input['key']) ?: 'fallback' 

// Това ще върне 'undefined index' бележка
// когато $output не е арея или няма 'key'.
//
// Ще върне 'undefined variable' бележка 
// когато $output не съществува.
$output = $input['key'] ?: 'fallback';

Оператора е удобен и за последователно навръзване:

$input = [
    'key' => 'key',
];

$input['undefined'] ?? $input['key'] ?? 'fallback'; // 'key'

Spaceship оператори

Макар и със странно име са много полезни. Това е оператор, ползван за сравнение, който връща винаги една от стойностите 0, -1 или 1. 0 връща в случайте, когато двата операнда са еднакви, 1 - когато левият е по-голям, а -1 - когато десният е по-голям.

1 <=> 2; // ще върне -1, тъй като 2 е по-голямо от 1

Могат да се сравняват и по-сложни неща:

// може да сравнява стрингове,
'a' <=> 'z'; // -1

// както и arrays,
[2, 1] <=> [2, 1]; // 0

// вложени arrays,
[[1, 2], [2, 2]] <=> [[1, 2], [1, 2]]; // 1

// дори и главни букви.
'Z' <=> 'z'; // -1

При сравнение на малки и главни букви малките са с по-висока стойност, тъй като се сравняват по стойност в ASCII таблицата, където са първо главни, после малки букви.

Spaceship може да сравнява почти всичко, включитено обекти. Начинът, по който се сравняват обектите, се основава на вида на обекта. Вградените класове в PHP могат да определят своето собствено сравнение, докато потребителските обекти се сравняват въз основа на техните атрибути и стойности. Ето едно сравнение на дати:

$dateA = DateTime::createFromFormat('Y-m-d', '2000-02-01');

$dateB = DateTime::createFromFormat('Y-m-d', '2000-01-01');

$dateA <=> $dateB; // връща 1

От голяма полза е когато трябва да сортирате масиви. Има няколко начина за сортиране на масив в PHP, а някои от тези методи позволяват потребителска функция за сортиране. Тази функция трябва да сравни два елемента и да върне 1, 0 или -1 въз основа на тяхната позиция.

$array = [5, 1, 6, 3];

usort($array, function ($a, $b) {
    return $a <=> $b;
});

// $array = [1, 3, 5, 6];

Ако искате да обърнете подреждането - просто обърнете резултата от сравнението:

usort($array, function ($a, $b) {
    return -($a <=> $b);
});

// $array = [6, 5, 3, 1];