doucheng3811
doucheng3811
2016-12-13 14:51

PHP中三点(...)的含义

已采纳

What is the meaning of Three dot (...) in PHP ?

While I am installing Magento 2 in my Sever I got an error. Investigate the code and found that there is a Three dot (...), which is producing the error. I mentioned the code below

return new $type(...array_values($args));
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • duanchun2349 duanchun2349 5年前

    The ...$str is called a splat operator in PHP.

    This feature allows you to capture a variable number of arguments to a function, combined with "normal" arguments passed in if you like. It's easiest to see with an example:

    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
    

    The parameters list in the function declaration has the ... operator in it, and it basically means " ... and everything else should go into $strings". You can pass 2 or more arguments into this function and the second and subsequent ones will be added to the $strings array, ready to be used.

    Hope this helps!

    点赞 评论 复制链接分享
  • dqq22391 dqq22391 2年前

    I'd like to share a usage of this operator in Magento framework, where it instantiates objects with dynamic configurable parameters (thought XML config files).

    As we can see the createObject function from the following code snippet, it takes in an array of the arguments prepared for the object creation. Then it uses the ...(three dots) operator to pass the array values as real arguments to the class's constructor.

    <?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) {
                ...
            }
        }
    
        ...
    
    }
    
    点赞 评论 复制链接分享
  • doule6314 doule6314 4年前

    Every answer refers to the same blog post, besides them, here is the official documentation about variable-length argument lists:

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

    In PHP 5.6 and later, argument lists may include the ... token to denote that the function accepts a variable number of arguments. The arguments will be passed into the given variable as an array

    It seems "splat" operator is not an official name, still it's cute!

    点赞 评论 复制链接分享
  • dongpa3109 dongpa3109 5年前

    This is the so called "splat" operator. Basically that thing translates to "any number of arguments"; introduced with PHP 5.6

    See here for further details.

    点赞 评论 复制链接分享
  • douhuitan5863 douhuitan5863 4年前

    To use this feature, just warn PHP that it needs to unpack the array into variables using the ... operator. See here for more details, a simple example could look like this:

    $email[] = "Hi there";
    $email[] = "Thanks for registering, hope you like it";
    
    mail("someone@example.com", ...$email);
    
    点赞 评论 复制链接分享
  • dqc2017 dqc2017 3年前

    It seems no one has mentioned it, so here to stay[It will also help Google (& Other SEs) guide devs who asking for Rest Parameters in PHP]:

    As indicated here its called Rest Parameters on JS & I prefer this meaningful naming over that splat thing!

    In PHP, The functionality provided by ...args is called Variadic functions which's introduced on PHP5.6. Same functionality was used to be implemented using func_get_args().

    In order to use it properly, you should use rest parameters syntax, anywhere it helps reducing boilerplate code.

    点赞 评论 复制链接分享

相关推荐