PHP에서 세 점 (…)의 의미


125

PHP에서 세 점 (...)의 의미는 무엇입니까?

내 서버에 Magento 2를 설치하는 동안 오류가 발생했습니다. 코드를 조사한 결과 오류를 생성하는 점 3 개 (...)가 있음을 발견했습니다. 아래 코드를 언급했습니다

return new $type(...array_values($args));

배열 포장 / PHP 5.6에 도입 된 패키지 풀기
마크 베이커

설치하기 전에 요구 사항을 확인 했습니까? devdocs.magento.com/guides/v2.0/install-gde/…
Mathieu de Lorimier

4
임의의 주석입니다. 이것은 JS의 스프레드 연산자입니다. :)
Chris Happy

이 경우 @ChrisHappy는 실제로 나머지 연산자 입니다.
Kenny Horna

답변:


191

...$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 배열에 추가됩니다.

도움이 되었기를 바랍니다!


1
감사합니다 :), 왜 SPLAT 연산자를 사용해야하나요, 대신 배열의 모든 문자열을 두 번째 인수로 전달할 수 있습니까 ???
bikash.bilz

3
@ bikash.bilz 나는 대답자를 위해 말할 것입니다 : 나는 그것이 단지 구문 적 설탕 이라고 생각합니다 . splat 연산자를 사용하면 인수를 [및로 묶지 않아도 ]됩니다. 별로 혜택은 아니지만 괜찮아 보인다고 생각합니다.
코 도스 존슨

20
가변 매개 변수도 유형 힌트 할 수 있습니다. 따라서 PHP 7.2에서는 function myFunc($foo, string ...$bar). 그런 다음 $bar함수에 문자열 배열 만 제공하고 런타임에 보장합니다. 단일 배열 매개 변수로는이를 수행 할 수 없습니다.
Jason

4
이것은 고정 된 수의 문자열이 필요한 컨텍스트에서 배열을 허용하기 때문에 단순한 구문 설탕 이상입니다. 고정 된 수의 문자열을 사용하려면 문자열 수가 변경 될 때마다 소스 코드를 리팩터링해야합니다.
dreftymac

2
쉬운 예는 데이터베이스를 쿼리하는 데 사용되는 함수 서명입니다. function get_data($fname,$lname,$age)이 세 가지 이외의 필드 function get_data(...$fields)를 변경하지 않으려면 변경해야합니다 $fields. 에서 원하는 필드 만 지정하면됩니다 . @heykatieben
dreftymac

21

모든 답변은 동일한 블로그 게시물을 참조하며, 가변 길이 인수 목록에 대한 공식 문서 다음과 같습니다.

http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list

PHP 5.6 이상에서 인수 목록에는 함수가 가변 개수의 인수를 허용 함을 나타내는 ... 토큰이 포함될 수 있습니다. 인수는 주어진 변수에 배열로 전달됩니다.

"splat"연산자는 공식 이름이 아닌 것 같지만 여전히 귀엽습니다!


13

두 가지 용도가있다 생략 부호 (...) 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

4
이것이 최고의 답변입니다. 매우 명확한 설명과 예. 감사합니다!!!
Jee

Unpack은 Doctrine의 OrX 기능에 매우 유용합니다
Erdal G.

5

이 기능을 사용하려면 PHP에 ... operator. 자세한 내용은 여기 를 참조 하십시오 . 간단한 예는 다음과 같습니다.

$email[] = "Hi there";
$email[] = "Thanks for registering, hope you like it";

mail("someone@example.com", ...$email);

4

의미는 연관 배열을 목록으로 분해한다는 것입니다. 따라서 메서드를 호출하기 위해 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!

하지만 그러지 마세요.


그렇게 못생긴 게 아니에요. 목록을 필요로하지만 교리의 ORX의 기능을 같이 해야합니다 (당신이 통과 얼마나 많은 요소 모르기 때문에) 배열을 패스포트 할 수 있습니다. 이 방법이 call_user_func_array
Erdal G를

3

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

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


3

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

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

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

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


1
플러스 PHP에서 나머지 매개 변수 찾는 구글을 돕는 하나
kapreski

1

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) {
            ...
        }
    }

    ...

}


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.