পিএইচপি-তে থ্রি ডট (…) এর অর্থ


125

পিএইচপি-তে থ্রি ডট (...) এর অর্থ কী?

আমি আমার সেভারে ম্যাজেন্টো 2 ইনস্টল করার সময় আমি একটি ত্রুটি পেয়েছি। কোডটি তদন্ত করুন এবং সেখানে একটি থ্রি ডট (...) রয়েছে যা ত্রুটি তৈরি করছে producing আমি নীচের কোড উল্লেখ করেছি

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

অ্যারে প্যাকিং / আনপ্যাকিং পিএইচপি 5.6 এ চালু হয়েছে
মার্ক বেকার

ইনস্টল করার আগে আপনি কি প্রয়োজনীয়তাগুলি পরীক্ষা করেছেন: devdocs.magento.com/guides/v2.0/install-gde/…
ম্যাথিউ ডি

4
কেবল একটি এলোমেলো মন্তব্য, এটি জেএসের স্প্রেড অপারেটর। :)
ক্রিস হ্যাপি

@ ক্রিসহ্যাপী এই ক্ষেত্রে এটি প্রকৃতপক্ষে বাকি অপারেটর
কেনি হর্না

উত্তর:


191

...$strএকটি বলা হয় পিএইচপি splat অপারেটর

এই বৈশিষ্ট্যটি আপনাকে কোনও ফাংশনে পরিবর্তনশীল সংখ্যক আর্গুমেন্ট ক্যাপচার করতে সহায়তা করে, যদি আপনি চান তবে "স্বাভাবিক" যুক্তিগুলির সাথে মিলিত হন। উদাহরণ সহ দেখতে এটি সবচেয়ে সহজ:

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
ধন্যবাদ :), কেন আমি এসপিএলএটি অপারেটর ব্যবহার করব, এর পরিবর্তে আমি এই সমস্ত স্ট্রিংগুলিকে একটি অ্যারেতে দ্বিতীয় যুক্তি হিসাবে পাস করতে পারি ???
বিকাশ.বিলজ

3
@ বিকাশ.বিলজ আমি উত্তরদাতার পক্ষে কথা বলব: আমি মনে করি এটি কেবল সিনট্যাকটিক চিনি । স্প্ল্যাট অপারেটর আপনাকে [এবং এর সাথে তর্কগুলি ঘিরে রাখা থেকে বাঁচায় ]। এটি কোনও উপকারের খুব বেশি নয় তবে আমি মনে করি এটি দুর্দান্ত দেখাচ্ছে।
কোডস জনসন

20
আপনি বৈকল্পিক পরামিতিগুলিও টাইপ-ইঙ্গিত করতে পারেন। সুতরাং পিএইচপি 7.2 এ, আপনি সংজ্ঞায়িত করতে পারেন function myFunc($foo, string ...$bar)। তারপরে $barআপনার ফাংশনটিকে স্ট্রিংগুলির একটি অ্যারে দেয় এবং রান-টাইমে গ্যারান্টিযুক্ত অন্য কিছুই নয়। আপনি একক অ্যারে প্যারামিটার দিয়ে এটি করতে পারবেন না।
জেসন

4
এটি কেবল সিনট্যাক্স চিনির চেয়েও বেশি কারণ এটি প্রসঙ্গে একটি অ্যারের অনুমতি দেয় যা অন্যথায় একটি নির্দিষ্ট সংখ্যক স্ট্রিংয়ের প্রয়োজন হয়। স্ট্রিংগুলির একটি নির্দিষ্ট সংখ্যার ব্যবহারের জন্য আপনার স্ট্রিং কোডটি প্রতিবার স্ট্রিংয়ের সংখ্যা পরিবর্তিত হতে পারে re
dreftymac

2
একটি সহজ উদাহরণ একটি ফাংশন স্বাক্ষর যা ডেটাবেসকে জিজ্ঞাসা করার জন্য ব্যবহৃত হয়। function get_data($fname,$lname,$age)যদি আপনি এই তিনটি বাদে অন্য ক্ষেত্র চান তবে পরিবর্তন function get_data(...$fields)করতে হবে, আপনার কেবলমাত্র ক্ষেত্রগুলি নির্দিষ্ট করতে হবে $fields। @hekatieben
dreftymac

21

প্রতিটি উত্তর একই ব্লগ পোস্টকে বোঝায়, সেগুলি ছাড়াও এখানে ভেরিয়েবল-দৈর্ঘ্যের আর্গুমেন্ট তালিকাগুলির বিষয়ে সরকারী নথি রয়েছে :

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

পিএইচপি 5.6 এবং তারপরে, যুক্তি তালিকাগুলিতে ... টোকেনটি অন্তর্ভুক্ত হতে পারে যাতে বোঝাতে ফাংশনটি একটি চলক সংখ্যক আর্গুমেন্ট গ্রহণ করে। আর্গুমেন্টগুলি অ্যারে হিসাবে প্রদত্ত ভেরিয়েবলটিতে পাঠানো হবে

দেখে মনে হচ্ছে "স্প্ল্যাট" অপারেটর কোনও অফিসিয়াল নাম নয়, এখনও এটি সুন্দর!


13

উপবৃত্তির জন্য টিডব্লিউও ব্যবহার রয়েছে (...) পিএইচপি টোকেন themএর মধ্যে একটি অ্যারে প্যাকিং এবং একটি অ্যারে আনপ্যাকিং হিসাবে বিবেচনা করুন । উভয় উদ্দেশ্য আর্গুমেন্ট ফাংশন প্রয়োগ।


প্যাক

যখন একটি ফাংশন সংজ্ঞা, যদি আপনি ফাংশন প্রদান করা ভেরিয়েবল একটি গতিশীল সংখ্যা প্রয়োজন (অর্থাত, তুমি কি জান না কত যুক্তি হল যে ফাংশন যখন কোডে নামে প্রদান করা হবে) ব্যবহার ঊহ্য শব্দ (...) টোকেন থেকে ফাংশন ব্লকের ভিতরে অ্যাক্সেসযোগ্য এমন অ্যারেতে সেই ফাংশনটিতে সরবরাহ করা সমস্ত আর্গুমেন্ট ক্যাপচার করুন। উপবৃত্ত (...) দ্বারা বন্দী গতিশীল আর্গুমেন্টের সংখ্যা শূন্য বা আরও বেশি হতে পারে।

উদাহরণস্বরূপ :

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

অ্যারে বা ভেরিয়েবলগুলি ম্যানিপুলেট করতে অ্যারে ফাংশনগুলি ব্যবহার করার সময় আনপ্যাকিং বিশেষভাবে কার্যকর ।

উদাহরণস্বরূপ, অ্যারে_স্লাইসের ফলাফলটি প্যাক করা :

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
এটি সেরা উত্তর। খুব স্পষ্ট ব্যাখ্যা এবং উদাহরণ। ধন্যবাদ!!!
জি

আনপ্যাক হ'ল ডক্ট্রিনের অরএক্স কার্যের জন্য দুর্দান্ত ব্যবহারযোগ্য
জি।

5

এই বৈশিষ্ট্যটি ব্যবহার করতে, কেবলমাত্র PHP কে সতর্ক করুন যে এটির সাহায্যে অ্যারেটি ভেরিয়েবলগুলিতে খুলতে হবে ... operator। দেখুন এখানে আরো বিস্তারিত জানার জন্য, একটি সহজ উদাহরণ ভালো চেহারা পারে:

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

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

4

এর অর্থ হ'ল এটি কোনও তালিকায় একটি মিশ্র অ্যারে পচন করে। সুতরাং আপনাকে কোনও পদ্ধতিতে কল করার জন্য 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;
        }
    }
} 

এটি টাইপ নিয়ন্ত্রণে কিছু প্রচেষ্টা বাঁচায়, বিশেষত বিশাল সংগ্রহের সাথে বা খুব বস্তু-কেন্দ্রিকের সাথে কাজ করার সময়।

লক্ষ্য করার জন্য গুরুত্বপূর্ণ এটি হ'ল ...$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!

কিন্তু দয়া করে না।


এটা যে কুৎসিত নয়। মতবাদের মত অরএক্স ফাংশনগুলির মতো যা একটি তালিকার প্রয়োজন তবে আপনাকে একটি অ্যারে পেস্ট করতে হবে (কারণ আপনি জানেন না যে আপনি কতগুলি উপাদান পাস করবেন)। কল_উজার_ফানস_আরয়ের ব্যবহারের চেয়ে আমি এই উপায়ে আরও ভাল পেয়েছি
জি।

3

এটি তথাকথিত "স্প্ল্যাট" অপারেটর। মূলত সেই জিনিসটি "যে কোনও সংখ্যক যুক্তি" তে অনুবাদ করে; পিএইচপি 5.6 সঙ্গে প্রবর্তিত

আরও বিশদ জন্য এখানে দেখুন ।


3

দেখে মনে হচ্ছে কেউ এটি উল্লেখ করেনি, তাই এখানে থাকার জন্য [এটি পিএইচপি-র বিশ্রামের পরামিতিগুলির জন্য জিজ্ঞাসা করা গুগল (এবং অন্যান্য এসই) ডিভাইসদের সহায়তা করবে ]:

এখানে যেমন জেএসে এটির রেস্ট প্যারামিটার হিসাবে ইঙ্গিত করা হয়েছে এবং আমি এই স্প্ল্যাট জিনিসটির চেয়ে অর্থপূর্ণ নামকরণটি পছন্দ করি!

পিএইচপি-তে, ... আরগস দ্বারা সরবরাহিত কার্যকারিতাটিকে ভারিয়াদিক ফাংশন বলা হয় যা পিএইচপি 5.6 এ চালু হয়েছিল। একই কার্যকারিতা ব্যবহার করে প্রয়োগ করা হত func_get_args()

এটি সঠিকভাবে ব্যবহার করার জন্য, আপনাকে বাকী প্যারামিটার সিনট্যাক্স ব্যবহার করা উচিত, যে কোনও জায়গায় এটি বয়লারপ্লেট কোড হ্রাস করতে সহায়তা করে ।


1
পিএইচপি

1

আমি এই অপারেটরের একটি ব্যবহারকে ম্যাজেন্টো ফ্রেমওয়ার্কে ভাগ করতে চাই, যেখানে এটি গতিশীল কনফিগারযোগ্য প্যারামিটারগুলির (চিন্তার এক্সএমএল কনফিগার ফাইল) দ্বারা বস্তুকে ইনস্ট্যান্ট করে।

যেহেতু আমরা 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) {
            ...
        }
    }

    ...

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.