Яке значення Три крапки (...) в PHP?
Поки я встановлюю Magento 2 у своєму Sever, я отримав помилку. Вивчіть код і виявили, що існує Три крапки (...), які створюють помилку. Код я згадав нижче
return new $type(...array_values($args));
Яке значення Три крапки (...) в PHP?
Поки я встановлюю Magento 2 у своєму Sever, я отримав помилку. Вивчіть код і виявили, що існує Три крапки (...), які створюють помилку. Код я згадав нижче
return new $type(...array_values($args));
Відповіді:
Це ...$strназивається оператором splat в 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
У списку параметрів у функційному оголошенні є ...оператор, і він в основному означає "... і все інше повинно входити в $ string". Ви можете передати 2 або більше аргументів у цю функцію, а другий та наступні будуть додані до масиву $ string, готові до використання.
Сподіваюся, це допомагає!
[і ]. Це не дуже корисно, але я думаю, що це виглядає приємно.
function myFunc($foo, string ...$bar). Потім $barнадає вашій функції масив рядків і нічого іншого, що гарантується під час виконання. Ви не можете це зробити з одним параметром масиву.
function get_data($fname,$lname,$age)доведеться змінити, якщо ви хочете, щоб поля, відмінні від цих трьох function get_data(...$fields), не повинні змінюватися, вам потрібно лише вказати поля, які ви хочете ввести $fields. @heykatieben
Кожна відповідь стосується одного і того ж допису в блозі, окрім них, ось офіційна документація про аргументи зі змінною довжиною :
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
У PHP 5.6 та пізніших версіях списки аргументів можуть включати маркер ... для позначення того, що функція приймає змінну кількість аргументів. Аргументи будуть передані в дану змінну у вигляді масиву
Здається, оператор "splat" - це не офіційна назва, все-таки це мило!
Є два способи використання токена PHP для еліпсису (...) - вони думають про упаковку масиву та розпакування масиву. Обидві цілі стосуються аргументів функції.
Пакувати
Визначаючи функцію, якщо вам потрібна динамічна кількість змінних, наданих функції (тобто ви не знаєте, скільки аргументів буде надано цій функції при виклику в коді), використовуйте маркер ellipsis (...) для захопити всі решта аргументів, наданих для цієї функції, у масив, доступний всередині функціонального блоку. Кількість динамічних аргументів, захоплених еліпсісом (...), може дорівнювати нулю або більше.
// 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
Коли упаковка використовується в екземплярі функцій, ellipsis (...) фіксує всі решта аргументів , тобто ви все одно можете мати будь-яку кількість початкових, фіксованих (позиційних) аргументів:
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
Розпакуйте
Крім того, при виклику функції, якщо аргументи, які ви надаєте цій функції, попередньо об'єднані в масив, використовуйте маркер ellipsis (...) для перетворення цього масиву в окремі аргументи, надані функції - кожен елемент масиву присвоюється відповідному змінна аргумент функції, названа у визначенні функції.
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
Щоб скористатися цією функцією, просто попередить PHP, що їй потрібно розпакувати масив у змінні за допомогою ... operator. Дивіться тут для більш детальної інформації, простий приклад може виглядати так:
$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);
Це означає, що він розкладає асоціативний масив до списку. Тому вам не потрібно вводити 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!
Але, будь ласка, не варто.
Здається, ніхто про це не згадував, тож тут зупинимось [Це також допоможе Google (та іншим SE) направляти розробників, які запитують параметри відпочинку в PHP ]:
Як зазначено тут, його називаються параметри відпочинку на JS & я віддаю перевагу цьому значущому називанню над цією справою!
У PHP функціонал, який надає ... args , називається Variadic функціями, які введені в PHP5.6. Таку ж функціональність використовували для реалізації func_get_args().
Щоб правильно ним користуватися, слід використовувати синтаксис параметрів відпочинку в будь-якому місці, де це сприяє зменшенню кодового коду .
Я хотів би поділитися використанням цього оператора в рамках 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) {
...
}
}
...
}
це оператор splat або розсіювання в PHP
довідка: оператор splat або розсіювання в PHP
У PHP 7.4 еліпсис також є оператором Spread :
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];