PHP에서 세 점 (...)의 의미는 무엇입니까?
내 서버에 Magento 2를 설치하는 동안 오류가 발생했습니다. 코드를 조사한 결과 오류를 생성하는 점 3 개 (...)가 있음을 발견했습니다. 아래 코드를 언급했습니다
return new $type(...array_values($args));
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 배열에 추가됩니다.
도움이 되었기를 바랍니다!
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 토큰 -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
의미는 연관 배열을 목록으로 분해한다는 것입니다. 따라서 메서드를 호출하기 위해 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()
.
적절하게 사용하려면 상용구 코드를 줄이는 데 도움이되는 모든 위치에서 나머지 매개 변수 구문을 사용해야 합니다 .
Magento 프레임 워크에서이 연산자의 사용법을 공유하고 싶습니다. 여기서 동적 구성 가능한 매개 변수 (XML 구성 파일로 간주)로 개체를 인스턴스화합니다.
createObject
다음 코드 스 니펫에서 함수를 볼 수 있듯이 객체 생성을 위해 준비된 인수의 배열을받습니다. 그런 다음 ...
(점 3 개) 연산자를 사용하여 배열 값을 클래스 생성자에 실제 인수로 전달합니다.
<?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) {
...
}
}
...
}
PHP에서 splat 또는 scatter 연산자입니다.
에서 PHP 7.4 줄임표는 또한 확산 연산자 :
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];