PHP में तीन डॉट (…) का मतलब


125

PHP में थ्री डॉट (...) का क्या अर्थ है?

जब मैं अपने सेवार में Magento 2 स्थापित कर रहा हूं तो मुझे एक त्रुटि मिली। कोड की जांच करें और पाया कि एक तीन डॉट (...) है, जो त्रुटि पैदा कर रहा है। मैंने नीचे दिए गए कोड का उल्लेख किया है

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

PHP 5.6 में
मार्क

क्या आपने इंस्टॉल करने से पहले की आवश्यकताओं की जांच की: devdocs.magento.com/guides/v2.0/install-gde/…
मैथ्यू डी लोरिमियर

4
बस एक यादृच्छिक टिप्पणी, यह जेएस में प्रसार ऑपरेटर है। :)
क्रिस हैप्पी

@ क्रिस इस मामले में वास्तव में बाकी ऑपरेटर हैं
केनी हॉर्ना

इन्हें भी देखें: PHP splat ऑपरेटर
dreftymac

जवाबों:


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

फ़ंक्शन घोषणा में पैरामीटर सूची में ...ऑपरेटर होता है, और इसका मूल रूप से मतलब है "... और बाकी सब $ स्ट्रिंग में जाना चाहिए"। आप इस फ़ंक्शन में 2 या अधिक तर्क पास कर सकते हैं और दूसरे और बाद वाले का उपयोग करने के लिए तैयार $ स्ट्रिंग्स सरणी में जोड़ा जाएगा।

उम्मीद है की यह मदद करेगा!


1
धन्यवाद :), मुझे SPLAT ऑपरेटर का उपयोग क्यों करना चाहिए, इसके बजाय मैं दूसरे तर्क के रूप में एक सरणी में उन सभी तारों को पारित कर सकता हूं ???
bikash.bilz 16

3
@ bikash.bilz मैं उत्तर देने वाले के लिए बोलूंगा: मुझे लगता है कि यह सिर्फ चीनी है । स्पैट संचालक आपको [और साथ बहस करने से बचाता है ]। यह ज्यादा फायदा नहीं है लेकिन मुझे लगता है कि यह अच्छा लग रहा है।
कोडोस जॉनसन

20
आप वैरिएड मापदंडों को भी टाइप कर सकते हैं। तो PHP 7.2 पर, आप परिभाषित कर सकते हैं function myFunc($foo, string ...$bar)। फिर $barअपने फंक्शन को स्ट्रिंग्स की एक सरणी देता है और कुछ और नहीं, रन-टाइम की गारंटी देता है। आप एक एकल सरणी पैरामीटर के साथ ऐसा नहीं कर सकते।
जेसन

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 और बाद में, तर्क सूचियों में शामिल हो सकता है ... यह बताने के लिए कि फ़ंक्शन तर्कों की एक चर संख्या को स्वीकार करता है। दिए गए चर में तर्कों को एक सरणी के रूप में पारित किया जाएगा

ऐसा लगता है कि "स्पैट" ऑपरेटर एक आधिकारिक नाम नहीं है, फिर भी यह प्यारा है!


13

वहाँ दीर्घवृत्त (...) PHP टोकन के लिए उपयोग करता है उनमें से एक सरणी पैकिंग और एक सरणी unpacking के रूप में उनमें से । फ़ंक्शन उद्देश्यों के लिए दोनों उद्देश्य लागू होते हैं।


पैक

किसी फ़ंक्शन को परिभाषित करते समय, यदि आपको फ़ंक्शन को प्रदान की जाने वाली चर की एक गतिशील संख्या की आवश्यकता होती है (अर्थात, आपको नहीं पता कि कोड में उस फ़ंक्शन को कितने तर्क प्रदान किए जाएंगे), इलिप्सिस (...) टोकन का उपयोग करें उस फ़ंक्शन को प्रदान किए गए सभी शेष तर्कों को एक सरणी में कैप्चर करें जो फ़ंक्शन ब्लॉक के अंदर पहुंच योग्य है। दीर्घवृत्त (...) द्वारा पकड़े गए गतिशील तर्कों की संख्या शून्य या अधिक हो सकती है।

उदाहरण के लिए :

// 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

जब फंक्शन इंस्टेंटेशन में पैकिंग का उपयोग किया जाता है, तो ellipsis (...) शेष सभी तर्कों को कैप्चर करता है , अर्थात, आपके पास अभी भी प्रारंभिक, निश्चित (स्थिति) तर्कों की कोई संख्या हो सकती है:

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

खोलना

किसी फ़ंक्शन को कॉल करते समय वैकल्पिक रूप से, यदि आप उस फ़ंक्शन को प्रदान करने वाले तर्क पहले से एक सरणी में जोड़ दिए जाते हैं, तो उस सरणी को फ़ंक्शन में प्रदान किए गए व्यक्तिगत तर्कों में परिवर्तित करने के लिए ellipsis (...) टोकन का उपयोग करें - प्रत्येक सरणी तत्व संबंधित को सौंपा गया है। फ़ंक्शन डेफिनेशन चर नाम फ़ंक्शन परिभाषा में।

उदाहरण के लिए:

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
यह सबसे अच्छा जवाब है। बहुत स्पष्ट व्याख्या और उदाहरण। धन्यवाद!!!
जीई

Unct Doctrine के OrX फंक्शन के लिए सुपर uselfull है
Erdal G.

5

इस सुविधा का उपयोग करने के लिए, बस PHP को चेतावनी दें कि इसका उपयोग करके चर में सरणी को अनपैक करना होगा ... operator। अधिक जानकारी के लिए यहां देखें , एक सरल उदाहरण इस तरह दिख सकता है:

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

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

4

अर्थ यह है कि यह एक सूची के लिए एक सहयोगी सरणी को विघटित करता है। तो आपको एक विधि को कॉल करने के लिए एन मापदंडों को टाइप करने की आवश्यकता नहीं है, बस एक। यदि विधि एक विघटित पैरामीटर की अनुमति देती है और यदि पैरामीटर एक ही प्रकार के हैं।

मेरे लिए, स्पैट ऑपरेटर के बारे में सबसे महत्वपूर्ण बात यह है कि यह प्रकार के मापदंडों को टाइप करने में मदद कर सकता है:

$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

यह तथाकथित "स्प्लैट" ऑपरेटर है। मूल रूप से वह चीज़ "तर्कों की किसी भी संख्या" में अनुवाद करती है; PHP 5.6 के साथ पेश किया गया

अधिक जानकारी के लिए यहां देखें ।


3

ऐसा लगता है कि किसी ने इसका उल्लेख नहीं किया है, इसलिए यहां रहने के लिए [यह Google (और अन्य एसईएस) गाइड देवों की भी मदद करेगा जो पीएचपी में रेस्ट पैरामीटर्स के लिए पूछ रहे हैं ]:

जैसा कि यहां बताया गया है कि जेएस पर रेस्ट पैरामीटर्स कहा जाता है और मैं उस स्पैट चीज़ पर इस सार्थक नामकरण को पसंद करता हूं!

PHP में, ... args द्वारा प्रदान की गई कार्यक्षमता को Variadic फ़ंक्शन कहा जाता है जो PHP5.6 पर प्रस्तुत किया गया है। उसी कार्यक्षमता का उपयोग करके लागू किया गया था func_get_args()

इसे ठीक से उपयोग करने के लिए, आपको बाकी मापदंडों के सिंटैक्स का उपयोग करना चाहिए, कहीं भी यह बॉयलरप्लेट कोड को कम करने में मदद करता है ।


1
प्लस एक PHP में आराम पैरामीटर खोजने में गूगल के लिए एक
kapreski

1

मैं इस ऑपरेटर के उपयोग को Magento के ढांचे में साझा करना चाहता हूं, जहां यह गतिशील विन्यास योग्य मापदंडों (सोचा XML कॉन्फ़िगरेशन फ़ाइलों) के साथ वस्तुओं को झटपट करता है।

जैसा कि हम createObjectफ़ंक्शन को निम्न कोड स्निपेट से देख सकते हैं , यह ऑब्जेक्ट निर्माण के लिए तैयार तर्कों की एक सरणी में लेता है। फिर यह ...सरणी के मूल्यों को कक्षा के निर्माता के लिए वास्तविक तर्क के रूप में पारित करने के लिए (तीन डॉट्स) ऑपरेटर का उपयोग करता है ।

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

    ...

}


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.