Jakie jest znaczenie trzech kropek (...) w PHP?
Podczas instalacji Magento 2 na moim serwerze wystąpił błąd. Zbadaj kod i znajdź trzy kropki (...), które powodują błąd. Wspomniałem o kodzie poniżej
return new $type(...array_values($args));
Jakie jest znaczenie trzech kropek (...) w PHP?
Podczas instalacji Magento 2 na moim serwerze wystąpił błąd. Zbadaj kod i znajdź trzy kropki (...), które powodują błąd. Wspomniałem o kodzie poniżej
return new $type(...array_values($args));
Odpowiedzi:
W PHP...$str
nazywany jest operatorem splat .
Ta funkcja umożliwia przechwytywanie zmiennej liczby argumentów do funkcji, w połączeniu z „normalnymi” argumentami przekazywanymi, jeśli chcesz. Najłatwiej zobaczyć na przykładzie:
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
Lista parametrów w deklaracji funkcji zawiera ...
operator i zasadniczo oznacza "... a wszystko inne powinno trafić do $ string". Możesz przekazać 2 lub więcej argumentów do tej funkcji, a drugi i kolejne zostaną dodane do tablicy $ strings, gotowe do użycia.
Mam nadzieję że to pomoże!
[
i ]
. Nie jest to duża korzyść, ale myślę, że ładnie wygląda.
function myFunc($foo, string ...$bar)
. Następnie $bar
daje twojej funkcji tablicę ciągów i nic więcej, gwarantowane w czasie wykonywania. Nie możesz tego zrobić z jednym parametrem tablicy.
function get_data($fname,$lname,$age)
będzie musiał się zmienić, jeśli chcesz, aby pola inne niż te trzy function get_data(...$fields)
nie musiały się zmieniać, wystarczy określić pola, w których chcesz $fields
. @heykatieben
Każda odpowiedź odnosi się do tego samego wpisu na blogu, poza nimi znajduje się oficjalna dokumentacja dotycząca list argumentów o zmiennej długości :
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
W PHP 5.6 i późniejszych, listy argumentów mogą zawierać token ... oznaczający, że funkcja przyjmuje zmienną liczbę argumentów. Argumenty zostaną przekazane do podanej zmiennej jako tablica
Wygląda na to, że operator "splat" nie jest oficjalną nazwą, ale nadal jest uroczy!
Istnieją DWA zastosowania wielokropka (...) token PHP - należy je traktować jako pakowanie tablicy i rozpakowywanie tablicy. Oba cele dotyczą argumentów funkcji.
Pakiet
Podczas definiowania funkcji, jeśli potrzebujesz dynamicznej liczby zmiennych dostarczanych do funkcji (tj. Nie wiesz, ile argumentów zostanie przekazanych do tej funkcji po wywołaniu w kodzie), użyj znacznika wielokropka (...), aby przechwytuje wszystkie pozostałe argumenty dostarczone do tej funkcji do tablicy, która jest dostępna wewnątrz bloku funkcyjnego. Liczba dynamicznych argumentów przechwyconych przez wielokropek (...) może wynosić zero lub więcej.
// 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
Gdy podczas tworzenia instancji funkcji używane jest pakowanie, wielokropek (...) przechwytuje wszystkie pozostałe argumenty , tj. Nadal można mieć dowolną liczbę początkowych, ustalonych (pozycyjnych) argumentów:
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
Rozpakować
Alternatywnie, podczas wywoływania funkcji, jeśli argumenty, które podajesz do tej funkcji, zostały wcześniej połączone w tablicę, użyj tokenu wielokropka (...), aby przekonwertować tę tablicę na indywidualne argumenty dostarczone do funkcji - każdy element tablicy jest przypisany do odpowiedniego zmienna argumentu funkcji wymieniona w definicji funkcji.
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
Rozpakowywanie jest szczególnie przydatne w przypadku używania funkcji tablicowych do manipulowania tablicami lub zmiennymi.
Na przykład rozpakowanie wyniku 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
Aby użyć tej funkcji, wystarczy ostrzec PHP, że musi rozpakować tablicę na zmienne przy użyciu rozszerzenia ... operator
. Zobacz tutaj, aby uzyskać więcej informacji, prosty przykład mógłby wyglądać następująco:
$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);
Oznacza to, że rozkłada tablicę asocjacyjną na listę. Nie musisz więc wpisywać parametrów N, aby wywołać metodę, tylko jedną. Jeśli metoda zezwala na zdekomponowany parametr i jeśli parametry są tego samego typu.
Dla mnie najważniejszą rzeczą dotyczącą operatora splat jest to, że może pomóc w wpisaniu parametrów tablicy podpowiedzi:
$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;
}
}
}
oszczędza trochę wysiłku związanego z kontrolą typów, szczególnie podczas pracy z dużymi kolekcjami lub bardzo zorientowanymi obiektowo.
Ważne jest, aby zauważyć, że należy ...$array
dekomponować tablicę pomimo typu jej elementów , więc możesz również pójść w brzydką drogę:
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!
Ale proszę, nie rób tego.
Wygląda na to, że nikt o tym nie wspomniał, więc zostańmy [Pomoże to również Google (i innym SE) poprowadzić twórców, którzy proszą o parametry odpoczynku w PHP ]:
Jak wskazano tutaj, jego nazwa to Rest Parameters w JS i wolę to znaczące nazewnictwo od tego splata!
W PHP funkcjonalność zapewniana przez ... args nazywa się funkcjami wariadycznymi, które zostały wprowadzone w PHP5.6. Ta sama funkcjonalność została zaimplementowana przy użyciu func_get_args()
.
Aby używać go poprawnie, powinieneś użyć składni parametrów resztowych, wszędzie tam, gdzie pomaga to zredukować standardowy kod .
Chciałbym udostępnić użycie tego operatora we frameworku Magento, gdzie tworzy on instancje obiektów z dynamicznymi parametrami konfigurowalnymi (myślę o plikach konfiguracyjnych XML).
Jak widać, createObject
funkcja z poniższego fragmentu kodu pobiera tablicę argumentów przygotowaną do stworzenia obiektu. Następnie używa ...
operatora (trzy kropki) do przekazania wartości tablicy jako rzeczywistych argumentów do konstruktora klasy.
<?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) {
...
}
}
...
}
jest to operator splat lub scatter w PHP
odniesienie: operator splat lub scatter w PHP
W PHP 7.4 wielokropek jest również operatorem Spread :
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];