Значение трех точек (...) в PHP

Что означает три точки (...) в PHP?

Когда я устанавливаю Magento 2 в свой сервер, я получил ошибку. Изучите код и обнаружите, что есть Три точки (...), которая выдает ошибку. Я упомянул код ниже

return new $type(...array_values($args));

12 ответов

Решение

...$str называется оператором сплат в PHP.

Эта функция позволяет вам захватывать переменное число аргументов функции в сочетании с "обычными" аргументами, передаваемыми, если хотите. Это проще всего увидеть на примере:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

Список параметров в объявлении функции имеет ... оператор в нем, и это в основном означает "... и все остальное должно идти в $ строк". Вы можете передать 2 или более аргументов в эту функцию, и второй и последующие аргументы будут добавлены в массив $ strings, готовый для использования.

Надеюсь это поможет!

Существует ДВА использования токена PHP с многоточием (...) - представьте их как упаковку массива и распаковку массива. Обе цели применимы к аргументам функции.


Упаковка

При определении функции, если вам нужно динамическое количество переменных, предоставляемых функции (т. Е. Вы не знаете, сколько аргументов будет предоставлено этой функции при вызове в коде), используйте токен с многоточием (...) для захватить все оставшиеся аргументы, предоставленные этой функции, в массив, доступный внутри функционального блока. Число динамических аргументов, захваченных многоточием (...), может быть равно нулю или больше.

Например:

// function definition
function sum(...$numbers) { // use ellipsis token when defining function
    $acc = 0;
    foreach ($numbers as $nn) {
        $acc += $nn;
    }
    return $acc;
}

// call the function
echo sum(1, 2, 3, 4); // provide any number of arguments

> 10

// and again...
echo sum(1, 2, 3, 4, 5);

> 15

// and again...
echo sum();

> 0

Когда упаковка используется при создании экземпляра функции, многоточие (...) захватывает все оставшиеся аргументы, т.е. у вас все еще может быть любое количество начальных фиксированных (позиционных) аргументов:

function sum($first, $second, ...$remaining_numbers) {
    $acc = $first + $second;
    foreach ($remaining_numbers as $nn) {
        $acc += $nn;
    }
    return $acc;
}

// call the function
echo sum(1, 2); // provide at least two arguments

> 3

// and again...
echo sum(1, 2, 3, 4); // first two are assigned to fixed arguments, the rest get "packed"

> 10

Распаковать

В качестве альтернативы, при вызове функции, если аргументы, которые вы предоставляете этой функции, предварительно объединены в массив, используйте токен с многоточием (...) для преобразования этого массива в отдельные аргументы, предоставляемые функции - каждый элемент массива назначается соответствующему переменная аргумента функции, указанная в определении функции.

Например:

function add($aa, $bb, $cc) {
    return $aa + $bb + $cc;
}

$arr = [1, 2, 3];
echo add(...$arr); // use ellipsis token when calling function

> 6

$first = 1;
$arr = [2, 3];
echo add($first, ...$arr); // used with positional arguments

> 6

$first = 1;
$arr = [2, 3, 4, 5]; // array can be "oversized"
echo add($first, ...$arr); // remaining elements are ignored

> 6

Распаковка особенно полезна при использовании функций массива для управления массивами или переменными.

Например, распаковка результата array_slice:

function echoTwo ($one, $two) {
    echo "$one\n$two";
}

$steaks = array('ribeye', 'kc strip', 't-bone', 'sirloin', 'chuck');

// array_slice returns an array, but ellipsis unpacks it into function arguments
echoTwo(...array_slice($steaks, -2)); // return last two elements in array

> sirloin
> chuck

Каждый ответ относится к одному и тому же сообщению в блоге, кроме них, вот официальная документация о списках аргументов переменной длины:

http://php.net/manual/en/functions.arguments.php

В PHP 5.6 и более поздних списки аргументов могут включать в себя токен..., обозначающий, что функция принимает переменное число аргументов. Аргументы будут переданы в данную переменную в виде массива.

Кажется, оператор "Сплат" не является официальным названием, но все же это мило!

Это означает, что ассоциативный массив разбивается на список. Таким образом, вам не нужно вводить N параметров для вызова метода, только один. Если метод допускает разложенный параметр, и если параметры одного типа.

Для меня самое важное в операторе splat - это то, что он может помочь напечатать параметры массива:

$items = [
    new Item(), 
    new Item()
];

$collection = new ItemCollection();
$collection->add(...$items); // !

// what works as well:
// $collection->add(new Item());
// $collection->add(new Item(), new Item(), new Item()); // :(

class Item  {};

class ItemCollection {

    /**
     * @var Item[]
     */
    protected $items = [];

    public function add(Item ...$items)
    {
        foreach ($items as &$item) {
            $this->items[] = $item;
        }
    }
} 

это экономит некоторые усилия по управлению типами, особенно при работе с огромными коллекциями или очень объектно-ориентированными.

Важно отметить, что ...$arrayразложите массив независимо от типа его элементов, поэтому вы также можете пойти по уродливому пути:

function test(string $a, int $i) {
    echo sprintf('%s way as well', $a);

    if ($i === 1) {
        echo('!');
    }
}

$params = [
    (string) 'Ugly',
    (int) 1
];

test(...$params);

// Output:
// Ugly way as well!

Но, пожалуйста, не надо.

В PHP 7.4 многоточие также является оператором распространения:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Источник: https://wiki.php.net/rfc/spread_operator_for_array

В PHP 8.1 этот синтаксис " (...)" используется как новый способ создания вызываемых объектов.

До PHP 8.1:

      $callable = [$this, 'myMethod'];

После PHP 8.1:

      $callable = $this->myMethod(...);

Источник: https://wiki.php.net/rfc/first_class_callable_syntax

Чтобы использовать эту функцию, просто предупредите PHP, что ему нужно распаковать массив в переменные, используя ... operator, Смотрите здесь для более подробной информации, простой пример может выглядеть так:

$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";

mail("someone@example.com", ...$email);

Это так называемый оператор "сплат". По сути, это означает "любое количество аргументов"; введено в PHP 5.6

Смотрите здесь для более подробной информации.

Кажется, никто не упомянул об этом, поэтому здесь, чтобы остаться [Это также поможет Google (и другим SE) направлять разработчиков, которые запрашивают параметры отдыха в PHP]:

Как указано здесь, это называется " Параметры покоя" на JS, и я предпочитаю это осмысленное именование, а не сплат!

В PHP функциональность, предоставляемая ... args, называется функциями Variadic, которые представлены в PHP5.6. Та же функциональность была использована для реализации func_get_args(),

Для того, чтобы использовать его правильно, вы должны использовать синтаксис остальных параметров, где бы это ни помогло уменьшить стандартный код.

Это оператор splat или scatter в PHP

ссылка: оператор splat или scatter в PHP

Я хотел бы поделиться использованием этого оператора в среде Magento, где он создает объекты с динамически настраиваемыми параметрами (файлы конфигурации XML).

Как мы можем видеть createObject Функция из следующего фрагмента кода принимает массив аргументов, подготовленных для создания объекта. Затем он использует ...(три точки) оператор для передачи значений массива в качестве реальных аргументов конструктору класса.

<?php

namespace Magento\Framework\ObjectManager\Factory;

abstract class AbstractFactory implements \Magento\Framework\ObjectManager\FactoryInterface
{
    ...

    /**
     * Create object
     *
     * @param string $type
     * @param array $args
     *
     * @return object
     * @throws RuntimeException
     */
    protected function createObject($type, $args)
    {
        try {
            return new $type(...array_values($args));
        } catch (\TypeError $exception) {
            ...
        }
    }

    ...

}

Версия 5.6 добавила оператор splat или иногда называлась распаковкой аргументов. Оператор splat - это 3 точки перед параметром. Оператор splat позволяет пользователю передавать произвольное количество параметров. Затем произвольные параметры преобразуются PHP в массив.

Итак, в чем разница между использованием оператора splat и массива или ассоциативного массива. Вы можете указать тип данных объектов, которые назначены оператору splat, и если они не соответствуют php, выдаст ошибку.

function addItemsToCart(CartItem ...$cartItems) {
    //$cartItems is an array of CartItem objects
}

$cartItem1 = new CartItem();
$cartItem2 = new CartItem();
$cartItem3 = new CartItem();

addItemsToCart($cartItem1, $cartItem2, $cartItem3);

ссылка: Здесь

Другие вопросы по тегам