PHP에서 세 점 (…)의 의미는 무엇입니까?
내 서버에 Magento 2를 설치하는 동안 오류가 발생했습니다. 코드를 조사한 결과 오류를 생성하는 점 3 개 (…)가 있음을 발견했습니다. 아래 코드를 언급했습니다
return new $type(...array_values($args));
답변
는 ...$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
함수 선언의 매개 변수 목록에는 ...
연산자가 포함되어 있으며 기본적으로 “… 그리고 다른 모든 항목은 $ strings에 들어가야합니다”를 의미합니다. 2 개 이상의 인수를이 함수에 전달할 수 있으며 두 번째 및 후속 인수는 사용할 준비가 된 $ strings 배열에 추가됩니다.
도움이 되었기를 바랍니다!
답변
모든 답변은 동일한 블로그 게시물을 참조하며, 가변 길이 인수 목록에 대한 공식 문서 는 다음과 같습니다.
http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list
PHP 5.6 이상에서 인수 목록에는 함수가 가변 개수의 인수를 허용 함을 나타내는 … 토큰이 포함될 수 있습니다. 인수는 주어진 변수에 배열로 전달됩니다.
“splat”연산자는 공식 이름이 아닌 것 같지만 여전히 귀엽습니다!
답변
두 가지 용도가있다 생략 부호 (…) PHP 토큰 -think 그들과 같은 포장 배열을하고 풀고 배열을. 두 목적 모두 함수 인수에 적용됩니다.
팩
함수를 정의 할 때 함수에 제공되는 변수의 동적 개수가 필요한 경우 (즉, 코드에서 호출 될 때 해당 함수에 얼마나 많은 인수가 제공되는지 알 수없는 경우) 줄임표 (…) 토큰을 사용합니다. 을 사용하여 해당 함수에 제공된 나머지 모든 인수를 함수 블록 내에서 액세스 할 수있는 배열로 캡처합니다. 줄임표 (…)로 캡처 된 동적 인수의 수는 0 개 이상일 수 있습니다.
예 :
// 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
답변
이 기능을 사용하려면 PHP에 ... operator
. 자세한 내용은 여기 를 참조 하십시오 . 간단한 예는 다음과 같습니다.
$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";
mail("someone@example.com", ...$email);
답변
의미는 연관 배열을 목록으로 분해한다는 것입니다. 따라서 메서드를 호출하기 위해 N 개의 매개 변수를 입력 할 필요가 없습니다. If method는 분해 된 매개 변수를 허용하고 매개 변수가 동일한 유형 인 경우.
저에게 splat 연산자에 대한 가장 중요한 점은 배열 매개 변수를 typehint하는 데 도움이 될 수 있다는 것입니다.
$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에서 Rest Parameters 를 요청하는 Google (및 기타 SE) 가이드 개발자에게도 도움이 될 것입니다 ] :
여기에 표시된대로 JS의 Rest Parameters 라고 하며이 표시가있는 것보다 의미있는 이름 지정을 선호합니다!
PHP에서는 … args 가 제공하는 기능 을 PHP5.6에 도입 된 Variadic 함수 라고 합니다. 을 사용하여 동일한 기능을 구현하는 데 사용되었습니다 func_get_args()
.
적절하게 사용하려면 상용구 코드를 줄이는 데 도움이되는 모든 위치에서 나머지 매개 변수 구문을 사용해야 합니다 .