source

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

factcode 2022. 9. 13. 22:03
반응형

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

마젠토 2, 의 점점, 3개의 점)이 ....에러가 발생하고 있습니다.이치노

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

이 오퍼레이터의 이름은 무엇이며, 그 목적은 무엇입니까?

이것은 말 그대로 PHP에서는 연산자라고 불리지만 다른 언어에서는 splat 연산자로 알려져 있습니다. 기능에 관한 2014 LornaJane 블로그 투고:

이 기능을 사용하면 필요에 따라 전달된 "normal" 인수와 조합하여 함수에 대한 변수 개수의 인수를 캡처할 수 있습니다.예를 들면 다음과 같습니다.

function concatenate($transform, ...$strings) {
  $string = '';
  foreach($strings as $piece) {
      $string .= $piece;
  }
  return($transform($string));    }

echo concatenate("strtoupper", "I'd ", "4 + 2, " apple");

(이렇하하,),I'D LIKE 6 APPLES)

에는 " "가 ....를 의미하며, 그 것은 "..."로 합니다." " " " ", 른른른른 "..."에 들어갑니다.$strings이할 수 두 번째 와 그 의 인수는 $에 됩니다.array사용할 수 있습니다.

줄임표(...) PHP 토큰에는 두 가지 용도가 있습니다.배열을 패킹하는 것과 배열을 언팩하는 것으로 생각해 주세요.두 가지 목적 모두 함수 인수에 적용됩니다.


포장하다

함수를 정의할 함수에 제공되는 동적 변수 수가 필요한 경우(즉, 코드 호출 시 해당 함수에 제공되는 인수 수를 알 수 없음), 변수 이름에 줄임표(...) 토큰을 접두사로 붙입니다....$numbers: 된 모든 변수에 , 「」는 「」의 「」의 「」의 「」의 「」의 「인수」(「」)의 「」를 참조해 주세요.$numbers이데올로기 때문에생략 부호(...)를 붙여서 캡처하는 인수 수는 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

함수 인스턴스화에 패킹을 사용하는 경우 변수 이름에 생략 부호(...)를 붙이면 나머지 모든 인수가 캡처됩니다.즉, 초기, 고정(위치) 인수의 숫자(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

... 접두사 생략 부호 변수는 나머지를 모두 캡처합니다.따라서 최종 함수 인수여야 합니다.


언팩

또는 함수를 호출할 때 해당 함수에 제공한 인수가 이전에 배열로 결합되어 있는 경우 생략 부호(...) 토큰 접두사 변수 "inline"을 사용하여 해당 배열 변수를 함수에 제공된 개별 인수로 변환합니다.임의의 수의 함수 인수가 생략 부호 프리픽스 변수로 대체되면 각 배열 요소는 함수 정의에서 명명된 각 함수 인수 변수에 할당됩니다.

예를 들어 다음과 같습니다.

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

모든 답변은 같은 블로그 투고를 참조하고 있습니다.이것들 외에 변수 길이의 인수 리스트에 관한 공식 문서는 다음과 같습니다.

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

PHP 5.6 이후에서는 인수 목록은 함수가 변수 개수의 인수를 받아들이는 것을 나타내는 ... 토큰을 포함할 수 있습니다.인수는 지정된 변수에 배열로 전달됩니다.

스플래트 연산자는 정식 이름은 아닌 것 같은데 귀엽네요!

PHP 7.4에서는 줄임표는 확산 연산자이기도 합니다.

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

출처 : https://wiki.php.net/rfc/spread_operator_for_array

즉, 연관 배열을 목록으로 분해합니다.따라서 메서드를 호출하기 위해 N개의 파라미터를 입력할 필요는 없습니다.하나만 입력합니다.메서드에서 분해된 매개 변수가 허용되고 매개 변수가 동일한 유형인 경우.

스플랫 연산자의 가장 중요한 점은 다음과 같은 배열 매개 변수를 입력할 수 있다는 것입니다.

$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;
        }
    }
} 

특히 대량의 컬렉션이나 매우 객체 지향적인 작업을 수행할 때 유형 제어에 대한 노력을 줄일 수 있습니다.

주의할 점은 아이템의 종류에 관계없이 어레이를 분해하기 때문에 다음과 같은 추악한 방법을 사용할 수 있다는 것입니다.

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 8 업데이트 - 명명된 인수

이제 PHP 8에서 관련 배열을 분해할 수 있습니다. 즉, 해당 배열을 위한 키가 있는 배열입니다.같은 이름의 인수를 가진 함수에서 사용하면 PHP는 값을 적절한 변수로 전송합니다.

$arr = [
  'pi' => 3.14,
  'r' => 4,
];

function circ($r, $pi) {
    return 2*$pi*$r;
}

// so that call
circ(...$arr);

// will be effectively a call of
circ(pi: 3.14, r: 4);

파라미터의 순서를 조금 덜 수 있습니다.


PHP 8.1 업데이트 - 호출 가능 생성에 대한 새로운 구문

해도 레레 despite despite despite despite despite despite despite... 컨텍스트에서에 도움이 .

$f = strtoupper(...); // creating a callable
echo $f('fo');

class test {
    public function func($a) {
        echo $a . PHP_EOL;
    }
}

$f = (new test)
         ->func(...); // creating a callable

$f('x');

에서 PHP를 합니다.이치노... operator자세한 것은, 여기를 참조해 주세요.간단한 예는 다음과 같습니다.

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

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

이른바 "splat" 연산자입니다.기본적으로 이것은 "임의의 수의 인수"로 번역됩니다.PHP 5.6에서 도입되었습니다.

자세한 것은, 여기를 참조해 주세요.

PHP 8.1에서 이 구문은(...)" 는 콜러블을 작성하는 새로운 방법으로 사용됩니다.

PHP 8.1 이전 버전:

$callable = [$this, 'myMethod'];

PHP 8.1 이후:

$callable = $this->myMethod(...);

출처 : https://wiki.php.net/rfc/first_class_callable_syntax

아무도 그 말을 하지 않은 것 같아서, 여기 머물려고 한다.[또한 PHPRest Parameters를 요구하는 개발자를 Google(및 기타 SE)에서 안내하는 데 도움이 됩니다]

여기 표시된 바와 같이, JS의 Rest Parameters라고 불리며, 저는 그 스플래트보다 이 의미 있는 이름을 선호합니다!

PHP에서 ...args에 의해 제공되는 기능은 PHP5.6에 도입된 Varadic 함수라고 불립니다. 같은 기능을 사용하여 구현되었습니다.func_get_args().

적절하게 사용하려면 보일러 플레이트 코드를 줄이는도움이 되는 모든 위치에서 rest 파라미터 구문을 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/41124015/what-is-the-meaning-of-three-dots-in-php

반응형