[php] PHP에서 세 점 (…)의 의미

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!

하지만 그러지 마세요.


답변

이것은 소위 “splat”연산자입니다. 기본적으로 그것은 “임의의 인수”로 번역됩니다. PHP 5.6에 도입

자세한 내용은 여기 를 참조 하십시오 .


답변

아무도 언급하지 않은 것 같으므로 여기에 머물러야합니다 [ PHP에서 Rest Parameters 를 요청하는 Google (및 기타 SE) 가이드 개발자에게도 도움이 될 것입니다 ] :

여기에 표시된대로 JS의 Rest Parameters 라고 하며이 표시가있는 것보다 의미있는 이름 지정을 선호합니다!

PHP에서는 … args 가 제공하는 기능 을 PHP5.6에 도입 된 Variadic 함수 라고 합니다. 을 사용하여 동일한 기능을 구현하는 데 사용되었습니다 func_get_args().

적절하게 사용하려면 상용구 코드를 줄이는 데 도움이되는 모든 위치에서 나머지 매개 변수 구문을 사용해야 합니다 .